JIT против NGen - в чем разница?
Поэтому, когда среда CLR загружает сборку.NET, она компилирует ее в машинный код. Этот процесс называется JITing. NGen - это также процесс компиляции сборки.NET в нативный код. Я не понимаю, в чем разница между двумя?
5 ответов
Разница в том, когда они происходят. Компиляция JIT происходит во время работы вашей программы. NGen обычно выполняется во время установки вашей программы и происходит до ее запуска. Одна из целей NGen - убрать штраф JIT с момента запуска приложения.
JIT выполняется только для каждого метода; это не JIT все... Только биты, которые вам нужны. Конечно, это первый, но измеримый хит в первый раз в метод (плюс дженерики и т. Д.). NGEN выполняет эту работу заранее, но должен выполняться на той же платформе / архитектуре и т. Д. - по существу, на этой машине. Это также означает добавление его в GAC и т. Д., Которым может потребоваться более высокий доступ.
Во многих случаях хорошо подходит JIT, особенно если приложение открыто в течение длительного времени (например, веб-серверы).
Одно очень важное отличие, которое еще предстоит упомянуть, состоит в том, что нативные кэшированные образы имеют "общие кодовые страницы", что существенно влияет на объем памяти приложений, работающих на Terminal Services или Citrix.
Важная вещь, которую нужно понять о NGEN, заключается в том, что, пока он компилирует ваш код, он также помечает кодовые страницы как разделяемые, чтобы несколько экземпляров вашего приложения могли совместно использовать части пространства памяти, используемого первым экземпляром. И это действительно полезно, если вы работаете под Terminal Services.
Это имеет очень важное значение для приложений, используемых несколькими пользователями на одной машине, поскольку они совместно используют память между процессами. Это может привести к очень странным, трудным для воспроизведения поведению и проблемам управления ресурсами, если кеши изображений не поддерживаются должным образом.
Из 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 делает все сразу, чтобы джиттинг не требовался.