JIT против NGen - в чем разница?

Поэтому, когда среда CLR загружает сборку.NET, она компилирует ее в машинный код. Этот процесс называется JITing. NGen - это также процесс компиляции сборки.NET в нативный код. Я не понимаю, в чем разница между двумя?

5 ответов

Решение

Разница в том, когда они происходят. Компиляция JIT происходит во время работы вашей программы. NGen обычно выполняется во время установки вашей программы и происходит до ее запуска. Одна из целей NGen - убрать штраф JIT с момента запуска приложения.

JIT выполняется только для каждого метода; это не JIT все... Только биты, которые вам нужны. Конечно, это первый, но измеримый хит в первый раз в метод (плюс дженерики и т. Д.). NGEN выполняет эту работу заранее, но должен выполняться на той же платформе / архитектуре и т. Д. - по существу, на этой машине. Это также означает добавление его в GAC и т. Д., Которым может потребоваться более высокий доступ.

Во многих случаях хорошо подходит JIT, особенно если приложение открыто в течение длительного времени (например, веб-серверы).

Одно очень важное отличие, которое еще предстоит упомянуть, состоит в том, что нативные кэшированные образы имеют "общие кодовые страницы", что существенно влияет на объем памяти приложений, работающих на Terminal Services или Citrix.

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

http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx.

Это имеет очень важное значение для приложений, используемых несколькими пользователями на одной машине, поскольку они совместно используют память между процессами. Это может привести к очень странным, трудным для воспроизведения поведению и проблемам управления ресурсами, если кеши изображений не поддерживаются должным образом.

Из MSDN...

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

http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

В основном NGen позволяет вам предварительно JIT и кэшировать сборку на локальном компьютере. Это позволяет быстрее запускать и иногда выполнять.

Здесь осталось много деталей, но:

Jit не совсем такой... Jit - это Just-In-Time, то есть он не компилируется в нативный код до тех пор, пока код, такой как метод, фактически не будет вызван. Есть только окурки до тех пор. Это останется в кэше, чтобы последующие вызовы метода не генерировали собственный код.

NGen делает всю сборку сразу. NGen делает все сразу, чтобы джиттинг не требовался.

Другие вопросы по тегам