Как и когда работает ngen.exe?
Я хочу узнать о преимуществах предварительной JIT-компиляции (ngen.exe). Какова роль процесса Native Image Generator (NGen) и почему он требуется?
Пожалуйста, приведите пример.
4 ответа
Для выполнения кода на платформе.NET представление https://en.wikipedia.org/wiki/Common_Intermediate_Language (CIL) необходимо преобразовать в машинный код. Если это происходит непосредственно перед выполнением, это называется компиляцией JIT (Just In Time). Вывод JIT не сохраняется, поэтому ваше управляемое приложение должно проходить JIT для каждого запуска.
Кроме того, вы можете использовать предварительную компиляцию, чтобы уменьшить накладные расходы при запуске, связанные с JIT-компиляцией. NGen выполняет предварительную компиляцию и сохраняет собственные изображения в собственном кэше изображений. Тогда приложения могут работать с собственными образами и могут столкнуться с более быстрым временем запуска из-за уменьшения накладных расходов на компиляцию JIT. Изначально NGen был технологией времени установки, разработчики заставляли установщиков приложений запускать команды NGen для запуска предварительной компиляции во время установки. Для получения более подробной информации, проверьте http://msdn.microsoft.com/en-us/magazine/cc163808.aspx. В этой статье приведен пример приложения, использующего NGen.
В Windows 8 (.NET 4.5) появился новый режим NGen: "Auto NGen". По сути, среда выполнения.NET генерирует журналы использования для управляемых приложений. Когда система находится в режиме ожидания, задача автоматического обслуживания выполняется в фоновом режиме и создает собственные изображения. Таким образом, разработчикам больше не нужно явно иметь дело с NGen. Обратите внимание, что эта функция включена только для приложений.NET 4.5+, которые ориентированы на Window Store или используют GAC. Вот страница MSDN, которая может быть полезна: http://msdn.microsoft.com/en-us/library/hh691758(v=vs.110).aspx
И это общий обзор NGen и связанных с ним технологий: Вам нужна скорость? Приложения.NET запускаются быстрее
Наконец, сами библиотеки.NET Framework используют NGen для повышения производительности. При обслуживании.NET Framework некоторые нативные образы становятся недействительными. Затем NGen необходимо запустить, чтобы заново сгенерировать недопустимые собственные изображения. Это делается автоматически через сервис.NET Runtime Optimization, который работает во время простоя.
Когда компилятор.NET компилирует код C# или VB.NET, он наполовину компилирует их и создает код CIL. Когда вы запускаете этот полукомпилированный.NET EXE-файл, JIT запускается в фоновом режиме и компилирует половинный CIL-код в полный машинный язык. Этот режим называется обычным JIT.
Вы также можете пойти другим путем и сказать, что не хотите компилировать во время выполнения, запустив полностью скомпилированный EXE-файл. Эта компиляция выполняется с помощью negen.exe. В этом случае JIT не участвует во время выполнения. Это называется режимом до JIT.
Если вы хотите увидеть, как они влияют на производительность, вы можете посмотреть это видео на YouTube, демонстрирующее режим компиляции Normal-JIT и pre-JIT:
Объясните JIT, Ngen.exe, Pre-Jit, Normal-Jit и Econo-Jit. (Вопросы интервью.NET)
NGen (Native Image Generator) в основном компилирует байт-код.NET ( CIL) в нативный код для компьютера, на котором он работает. Преимущество заключается в том, что вы не компилируете код на native каждый раз, запускаете его или вам это нужно, но вы делаете это только один раз, приложение запускается и работает быстрее. Если вам нужна дополнительная информация, есть много ресурсов о преимуществах JIT по сравнению с Ahead of Time Compilation (что и делает NGen).
По MSDN:
Native Image Generator (Ngen.exe) - это инструмент, который повышает производительность управляемых приложений. Ngen.exe создает собственные образы, которые представляют собой файлы, содержащие скомпилированный машинный код для конкретного процессора, и устанавливает их в собственный кэш изображений на локальном компьютере. Среда выполнения может использовать нативные образы из кэша вместо компилятора JIT (Just-in-Time) для компиляции исходной сборки.
Я использовал NGEN в прошлом во время установки, чтобы программное обеспечение запускалось быстрее.