Как и когда работает ngen.exe?

Я хочу знать преимущества компиляции до JIT (ngen.exe). Какова роль процесса Native Image Generator (NGen) и почему он требуется?

Просьба привести пример.

Ответ 1

Для выполнения кода на платформе .NET представление Common Intermediate Language (CIL) необходимо преобразовать в машинный код. Если это происходит непосредственно перед выполнением, это называется компиляцией JIT (Just In Time). Вывод JIT не сохраняется, поэтому ваше управляемое приложение должно проходить JIT при каждом запуске.

Кроме того, вы можете использовать предварительную компиляцию, чтобы уменьшить накладные расходы при запуске, связанные с JIT-компиляцией. NGen выполняет предварительную компиляцию и сохраняет собственные изображения в собственном кэше изображений. Тогда приложения могут работать с собственными образами и могут столкнуться с более быстрым временем запуска из-за уменьшения накладных расходов при компиляции JIT. Изначально NGen был технологией времени установки, разработчики заставляли установщиков приложений запускать команды NGen для запуска предварительной компиляции во время установки. Для получения более подробной информации, ознакомьтесь с NGen Revs Up Your Performance с новыми мощными функциями. В этой статье приведен пример приложения, использующего NGen.

В Windows 8 (.NET 4.5) появился новый режим NGen: "Auto NGen". По сути, среда выполнения .NET генерирует журналы использования для управляемых приложений. Когда система находится в режиме ожидания, задача автоматического обслуживания выполняется в фоновом режиме и создает собственные изображения. Таким образом, разработчикам больше не нужно явно иметь дело с NGen. Обратите внимание, что эта функция включена только для приложений .NET 4. 5+, которые ориентированы на Window Store или используют GAC. Вот страница MSDN, которая может быть полезна: Создание собственных изображений

И это общий обзор NGen и связанных с ним технологий: Вам нужна скорость? Приложения .NET запускаются быстрее

Наконец, сами библиотеки .NET Framework используют NGen для повышения производительности. При обслуживании .NET Framework некоторые нативные образы становятся недействительными. Затем NGen необходимо запустить, чтобы заново сгенерировать недопустимые собственные изображения. Это делается автоматически через сервис .NET Runtime Optimization, который работает во время простоя.

Ответ 2

.NET compilation flow

Когда компилятор .NET компилирует код С# или 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)

Ответ 3

Per MSDN:

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

Я использовал NGEN в прошлом во время установки, чтобы программное обеспечение запускалось быстрее.

Ответ 4

NGen (Native Image Generator) в основном компилирует .NET-байтовый код (CIL) в собственный код для компьютера, на котором он работает. Преимущество состоит в том, что, учитывая, что вы не каждый раз компилируете код в native, вы запускаете его или нуждаетесь в нем, но вы делаете это только один раз, приложение запускается и запускается быстрее. Если вы хотите получить больше информации, есть много ресурсов о преимуществах JIT vs. Ahead of Time Compilation (что и делает NGen).