检测JIT是否可用

时间:2015-09-08 11:44:44

标签: c# xamarin jit

如果JIT引擎是否以便携方式可用,那么规范(如果有的话,任何可靠的)方法是什么?

例如,Xamarin.iOS不支持JIT,因为iOS平台强制执行DEP。 Mono很擅长通过解释像lambda表达式这样的大多数事情来弥合差距,但有些事情没有(正确)实现,导致运行时异常严重损害性能。

如果可能,我想从共享的可移植类库中执行此检测。

3 个答案:

答案 0 :(得分:2)

您可以尝试执行一项您知道将在AoT代码上失败的操作但不在JIT上执行操作(例如,动态创建类型)并使用try / catch块来定义JIT是否可用。

可以像这样实现(请注意,只有当链接器设置为“链接所有程序集”时才会失败):

private static bool? _isJITAvailable = null;
public static bool IsJITAvailable()
{
    if(_isJITAvailable == null)
    {
        try
        { 
            //This crashes on iPhone
            typeof(GenericClass<>).MakeGenericType(typeof(int));
            _isJITAvailable = true;
        }
        catch(Exception)
        {
            _isJITAvailable = false;
        }
    }

    return _isJITAvailable.Value;
}
但是,我不会这样做。你真的需要那些“表现更好的回调”吗?这听起来像是一个不成熟的优化。

答案 1 :(得分:1)

在深入研究Mono源代码后,似乎“魔术”构建时属性为FULL_AOT_RUNTIME。例如,System.Reflection.Emit.AssemblyBuilder是根据未设置的属性进行有条件编译的,这意味着

var canJit = Type.GetType ("System.Reflection.Emit.AssemblyBuilder") != null;

应该得到我想要的东西。

答案 2 :(得分:0)

为什么不在运行时测试两个回调的性能?

如果您的平台比平台慢,请使用平台 如果平台比你的慢,请使用你的平台。