Оптимизация запуска приложений .NET - Производительность NGen
ОГЛАВЛЕНИЕ
Производительность NGen
Генератор машинных образов (NGen) всегда помогает ускорить горячий запуск, потому что позволяет избежать JIT-компиляции кода. NGen может помочь и в случае холодного запуска, если не нужно загружать mscorjit.dll, потому что весь код, ипсользуемый приложением уже заранее скомпилирован с помощью NGen. Однако, если хотя бы один из модулей не имеет соответствующего машинного образа, mscorjit.dll будет загружен. Тогда будет JIT-компилироваться код, занимая циклы ЦП, а также будут затронуты многие страницы образов NGen, так как компилятор JIT должен считать метаданные. Время запуска окажется в итоге еще больше. Поэтому стоит удалить весь код, который может вызвать JIT-компиляцию при запуске. Конечно, следует ли использовать этот подход, можно решить, только измерив скорость холодного запуска с и без создания машинных образов, потому что итоговое преимущество NGen при холодном запуске зависит от кода и размера приложения; нет гарантий ощутимого улучшения запуска, даже если исключено JIT-компилирование.
Один из способов определить, происходит ли и когда JIT-компилирование, это помощники отладки управляемых приложений (MDA). JIT MDA позволяет либо остановить отладчик, либо вывести информацию отладки при JIT-компиляции метода. MDA можно включить, выставив переменную среды следующим образом:
COMPLUS_MDA=JitCompilationStart
Приложение остановит отладчик при JIT-компиляции кода. MDA можно также установить с помощью реестра или файла .config приложения. Узнать больше об использовании MDA можно в боковой панели «Материалы о скорости запуска» .
В общем случае, чтобы NGen действительно увеличил скорость холодного запуска, нужно обеспечить следующее:
- Все приложение обработано NGen.
- Нет модификаций базового адреса. Модификация базового адреса – очень ресурсоемкая операция, и код после этого не может быть общим. Дополнительную информацию о том, как установить базовый адрес, можно найти по адресу msdn.microsoft.com/msdnmag/issues/06/05/CLRInsideOut.
- Сборки установлены в глобальный кэш сборок (GAC). Проверка строгих имен затрагивает весь файл, но пропускается для всех сборок, установленных в GAC.