检测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;
应该让我得到我想要的。
为什么不在运行时测试两个回调的性能?
如果您的平台比平台慢,请使用平台。
如果平台比您的平台慢,请使用您的平台。
上一篇: Detecting if JIT is available
下一篇: howto: elastic beanstalk + deploy docker + graceful shutdown