JIT против NGen - в чем разница? - PullRequest
31 голосов
/ 02 апреля 2011

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

Ответы [ 5 ]

32 голосов
/ 02 апреля 2011

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

16 голосов
/ 02 апреля 2011

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

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

9 голосов
/ 30 октября 2012

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

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

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

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

7 голосов
/ 02 апреля 2011

Из MSDN ...

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

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

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

3 голосов
/ 02 апреля 2011

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

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

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

...