Я могу избежать JIT в.NET?

Скажите, будет ли мой код всегда работавшим конкретный процессор и если у меня есть эта информация во время установки - там шанс, я могу избежать JIT?

5
задан Peter Mortensen 1 October 2019 в 20:46
поделиться

3 ответа

Вы не должны избегать JIT, если у Вас есть информация о ЦП в установке.

Если Вы компилируете свои модули с помощью / платформы: [x86/x64/IA64] переключаются, компилятор будет включать эту информацию в получающийся файл PE так, чтобы CLR был JIT код в соответствующий собственный код ЦП и оптимизировать код для той архитектуры ЦП.

Можно использовать NGEN, да, но только если Вы хотите улучшить запуск приложения в результате уменьшенного рабочего набора в выполнении процессов не becuase, Вы избежали бы JITting. И необходимо на самом деле сравнить производительность файлов NGEN'd с тем из non-NGEN'd файлов, чтобы удостовериться, что NGEN'd каждый быстрее.

NGEN не может сделать столько предположений о среде выполнения, сколько JIT-компилятор может и поэтому производить неоптимизированный код.

Например: это добавляет косвенность для статического доступа к полю, потому что исполнительный адрес статических полей известен только во время выполнения.

6
ответ дан 18 December 2019 в 05:44
поделиться

Используйте NGEN:

Собственный Генератор Изображения (Ngen.exe) является инструментом, который улучшает производительность управляемых приложений. Ngen.exe создает собственные изображения, которые являются файлами, содержащими, скомпилировал определенный для процессора машинный код и устанавливает их в собственный кэш изображений на локальном компьютере. Время выполнения может использовать собственные изображения от кэша вместо этого с помощью своевременного (JIT) компилятора для компиляции исходного блока...

Для получения дополнительной информации об использовании Ngen.exe и собственного сервиса изображения, посмотрите Собственный Сервис Изображения...

13
ответ дан 18 December 2019 в 05:44
поделиться

NGEN является очевидным ответом, но я указал бы, что код редактора JIT может быть быстрее, поскольку он "знает" о вещах во времени выполнения, что NGEN не может. Мы используем тот факт для буквально линий проекции кода пола во времени выполнения на основе установки в наших .config файлах:

static readonly bool _EnableLogging = LoadFromConfigFile("EnableLogging");
if (_EnableLogging && log.IsDebugEnabled)
{
   //Do some logging
}

В этом примере NGEN должен уехать, если оператор в коде, потому что он понятия не имеет, каково значение _EnableLogging поля. Однако JIT действительно знает значение для этого выполнения и если это - ложь затем нет никакого пути, если оператор будет когда-либо обрабатываться, и JIT буквально опустит все, если оператор из машинного кода это генерирует, приводя к меньшей кодовой базе и поэтому более быстрой кодовой базе.

11
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: