Можно ли избежать JIT в .net? - PullRequest
       9

Можно ли избежать JIT в .net?

5 голосов
/ 15 января 2009

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

Ответы [ 3 ]

13 голосов
/ 15 января 2009

Использование НГЕН :

Native Image Generator (Ngen.exe) - это инструмент, который повышает производительность управляемых приложений. Ngen.exe создает собственные образы, которые представляют собой файлы, содержащие скомпилированный машинный код для конкретного процессора, и устанавливает их в собственный кэш изображений на локальном компьютере. Среда выполнения может использовать собственные образы из кэша вместо использования компилятора Just-in-Time (JIT) для компиляции исходной сборки ...

Дополнительные сведения об использовании Ngen.exe и службы собственных изображений см. В разделе Служба собственных изображений ...

.
11 голосов
/ 11 марта 2009

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

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

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

6 голосов
/ 15 января 2009

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

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

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

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

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

...