Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Одно очень важное существенное различие, о котором еще нельзя упомянуть, состоит в том, что собственные кэшированные изображения имеют "общие кодовые страницы", что существенно влияет на объем памяти приложений, работающих через 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.

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

Ответ 4

Из MSDN...

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

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

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

Ответ 5

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

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

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