2015-09-08 2 views
7

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

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

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

+1

Хм, нет, вы не можете использовать джиттер на iOS, потому что Apple запрещает его. Они не будут сертифицировать приложение. Попытка обнаружить такие специфичные для платформы детали из портативной библиотеки - это не стартер, главное приложение должно помочь. –

+0

Apple запрещает использование этих страниц, которые невозможно загрузить, никогда не становится исполняемым (исключение Safari). Я думаю, это еще один способ сказать это :) – Krumelur

ответ

1

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

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

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

2

Возможно, вы попытаетесь выполнить операцию, которая, как вы знаете, завершится неудачей по вашему коду AoT, но не на JIT (например, для создания типа динамически) и используйте блок try/catch, чтобы определить, доступен ли JIT.

Это может быть реализовано следующим образом (обратите внимание, что это не получится только тогда, когда линкер установлен в «Link Все сборки»):

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; 
} 

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

+0

Я не думаю, что ловить 'Исключение' - это путь, потому что это может быть буквально что угодно,' StackOverflowException', 'OutOfMemoryException' и т. Д.,. – Kamo

+0

Ваш вопрос правильный @Kamo. Я не помню специфическое исключение, созданное 'MakeGenericType' в этом случае, и у меня нет никаких средств для его проверки прямо сейчас, но я буду обновлять ответ, как только я это сделаю –

+0

В этом конкретном случае я думаю, что это' NotSupportedException ':) – Kamo

0

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

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

+0

Звучит немного неудобно для меня. Мое текущее решение - позволить главному приложению намекнуть на это, что не совсем плохо. Я просто хотел узнать, есть ли более аккуратное решение. – Krumelur

Смежные вопросы