检测JIT是否可用

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

例如,Xamarin.iOS不支持JIT,因为iOS平台执行DEP。 Mono现在很善于通过解释lambda表达式等大多数东西来弥补差距,但有些东西没有(正确)执行,导致运行时异常严重损害性能。

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


你可以尝试执行一个你知道在你的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;
}

不过,我不这样做。 开始时你真的需要那些“更好的回调”吗? 这听起来像是一个不成熟的优化。


在深入了解Mono源代码之后,似乎“魔法”构建时属性为FULL_AOT_RUNTIME 。 例如, System.Reflection.Emit.AssemblyBuilder是根据此属性未设置进行有条件编译的,意思是

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

应该让我得到我想要的。


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

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

链接地址: http://www.djcxy.com/p/28851.html

上一篇: Detecting if JIT is available

下一篇: howto: elastic beanstalk + deploy docker + graceful shutdown