Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测JIT是否可用_C#_Xamarin_Jit - Fatal编程技术网

C# 检测JIT是否可用

C# 检测JIT是否可用,c#,xamarin,jit,C#,Xamarin,Jit,检测JIT引擎是否以可移植的方式可用的标准方法(如果有的话,或者任何可靠的方法)是什么 例如,Xamarin.iOS不支持JIT,因为iOS平台强制执行。Mono现在非常擅长通过解释像lambda表达式这样的大多数东西来缩小差距,但是有些东西没有(正确地)实现,导致运行时异常严重影响性能 如果可能的话,我想从共享的可移植类库中执行此检测。您可以尝试执行一个操作,您知道该操作将在AoT代码上失败,但在JIT上不会失败(例如,动态创建类型),并使用try/catch块定义JIT是否可用 它可以这样实

检测JIT引擎是否以可移植的方式可用的标准方法(如果有的话,或者任何可靠的方法)是什么

例如,Xamarin.iOS不支持JIT,因为iOS平台强制执行。Mono现在非常擅长通过解释像lambda表达式这样的大多数东西来缩小差距,但是有些东西没有(正确地)实现,导致运行时异常严重影响性能


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

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

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

私有静态bool_isJITAvailable=null;
公共静态bool IsJITAvailable()
{
如果(_isJITAvailable==null)
{
尝试
{ 
//这在iPhone上崩溃了
typeof(GenericClass).MakeGenericType(typeof(int));
_isJITAvailable=true;
}
捕获(例外)
{
_isJITAvailable=false;
}
}
返回_isJITAvailable.Value;
}

不过,我不会这样做。您真的需要这些“性能更好的回调”作为开始吗?这听起来像是过早的优化。

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

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

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

在深入研究Mono源代码之后,“神奇”的构建时属性似乎是
FULL\u AOT\u RUNTIME
。例如,
System.Reflection.Emit.AssemblyBuilder
是根据未设置的属性有条件编译的,这意味着

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

你应该给我想要的。

嗯,不,你不能在iOS上使用抖动,因为苹果禁止它。他们不会认证该应用程序。试图从一个可移植的库中发现这些特定于平台的细节是不可能的,主应用程序需要帮助。苹果禁止这样做,因为它强制规定可写的页面永远无法执行(Safari是例外)。我想这是另一种说法:)我不认为捕获
异常
是一种方法,因为它可以是任何东西,
StackOverflowException
OutOfMemoryException
等等……你的观点是正确的@Kamo。我不记得在这种情况下,
MakeGenericType
引发的特定异常,我现在没有办法测试它,但在这种情况下,我会尽快更新答案。我认为这是
NotSupportedException
:)@WilliamBarbosa谢谢,这可能是一个解决方案。下次到构建机器时我会检查它。是的,我需要基于测量的数据。此外,Mono解释器似乎对我所做的一些操作抛出了NotImplementedException。@WilliamBarbosa上述构造现在在Xamarin.iOS中工作,大多数lambda表达式也是如此。因此,上面的解决方案不再检测不存在JIT。听起来有点尴尬。我目前的解决方案是让主应用程序提示这一点,这并不完全是坏事。我只是想知道是否有更整洁的解决方案。
var canJit = Type.GetType ("System.Reflection.Emit.AssemblyBuilder") != null;