如果JIT引擎是否以便携方式可用,那么规范(如果有的话,任何可靠的)方法是什么?
例如,Xamarin.iOS不支持JIT,因为iOS平台强制执行DEP。 Mono很擅长通过解释像lambda表达式这样的大多数事情来弥合差距,但有些事情没有(正确)实现,导致运行时异常严重损害性能。
如果可能,我想从共享的可移植类库中执行此检测。
答案 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)
为什么不在运行时测试两个回调的性能?
如果您的平台比平台慢,请使用平台 如果平台比你的慢,请使用你的平台。