Обнаружение, если JIT доступен

Каким может быть канонический (если таковой имеется, какой-либо надежный) способ обнаружения, если движок JIT доступен портативным способом?

Например, Xamarin.iOS не поддерживает JIT, поскольку платформа iOS обеспечивает DEP. Моно неплохо справляется с разрывом, интерпретируя большинство вещей, таких как лямбда-выражения в наши дни, но некоторые вещи не выполняются (должным образом), что приводит к исключениям во время выполнения, которые сильно ухудшают производительность.

Я хочу сделать это обнаружение из общедоступной библиотеки портативных классов, если это возможно.

3 ответа

После некоторого копания в исходном коде Mono, кажется, что "волшебное" свойство времени сборки FULL_AOT_RUNTIME. Например, System.Reflection.Emit.AssemblyBuilder условно компилируется на основе этого свойства, которое не задано, что означает

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

должен получить мне то, что я хочу.


Вы можете попытаться выполнить операцию, которая, как вы знаете, завершится неудачей в вашем коде 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;
}

Я бы этого не сделал. Вам действительно нужны эти "более эффективные обратные вызовы"? Это действительно звучит как преждевременная оптимизация.


Почему бы не проверить производительность двух обратных вызовов во время выполнения?

Если вы медленнее, чем платформа, используйте платформу. Если платформа медленнее вашей, используйте ваши.

licensed under cc by-sa 3.0 with attribution.