Девятый бит: Блог кафедры АСОИУ ОмГТУ

Ускоряем .NET

.NET logoВместе с .NET Framework в систему ставятся службы .NET Runtime Optimization Service, задача которых состоит в кэшировании и сборке нативных приложений из байт-кода. Следовательно, если запускаемая программа либо используемая библиотека уже находятся в кэше, то они будут быстрее запускаться и работать.

Из такого описания кажется, что достаточно оставить эти службы работать, и они автоматически в фоне проделают всю работу, но это не так. Во-первых, эти службы не сканируют весь диск в поисках .NET программ — разработчик должен сделать это явно. Во-вторых, все просьбы добавить в кэш имеют приоритет.

Приоритетов всего 3:

  1. выполнить немедленно
  2. отложить выполнение до завершения операций первого приоритета
  3. отложить, и выполнить во время простоя компьютера

Так вот, если задания с приоритетом 1 и 2 обрабатываются нормально, то задания 3-го приоритета могут вечно стоять в этой очереди. Поэтому хорошо бы форсировать этот процесс.

MSDN нам говорит, что тянуть за ниточки можно при помощи Ngen.exe.

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

Ngen.exe лежит в
%WINDIR%\Microsoft.NET\Framework\<версия>\
для 32bit систем, и в
%WINDIR%\Microsoft.NET\Framework64\<версия>\
для 64bit систем.

Запускать всегда стоит Ngen.exe из последней версии .NET Framework (если в ней есть Ngen.exe). Если у вас 64bit система, то вам вначале надо запустить 32bit версию Ngen.exe, а затем 64bit. Одновременно запускать 32bit и 64bit версии нельзя!

Если количество ядер в вашей системе два и более, то Ngen.exe можно запустить в любое время — он полностью загрузит только 1 ядро (это справедливо для текущей версии .NET — v4.0.30319).

Теперь осталось вызвать Ngen.exe от админа так:

ngen.exe executeQueuedItems

Также, иногда стоит запускать обновление всего кэша:

ngen.exe update

Обычно после обновления .NET Framework запускается обновление кэша, и установщик обновления ждет, пока оно не закончится. Но установщик не будет ждать вечно, у него есть таймер, и, если обновление кэша не уложилось в отведенное время, то выдается ошибка и все откатывается. Чтобы установить такие обновления, надо во время установки, при появлении процесса Ngen.exe, убить его. После завершения установки обновления надо будет выполнить вручную отложенные операции, т.е. запустить Ngen.exe от админа:

ngen.exe executeQueuedItems

P.S. Вот еще статья на эту же тему

You must be logged in to post a comment.