Повышение производительности запуска с помощью NGen

Примечание.

Только в EF6 и более поздних версиях. Функции, API и другие возможности, описанные на этой странице, появились в Entity Framework 6. При использовании более ранней версии могут быть неприменимы некоторые или все сведения.

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

До версии 6 основные библиотеки среды выполнения EF были частью платформа .NET Framework и собственных образов были созданы автоматически для них. Начиная с версии 6 вся среда выполнения EF была объединена в пакет NuGet EntityFramework. Собственные образы теперь необходимо создать с помощью средства командной строки NGen.exe, чтобы получить аналогичные результаты.

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

Как использовать NGen.exe

Основная функция средства NGen.exe — установка (т. е. создание и сохранение на диске) собственных образов сборки и всех его прямых зависимостей. Вот как это можно сделать:

  1. Откройте окно командной строки с правами администратора.

  2. Измените текущий рабочий каталог на расположение сборок, для которого требуется создать собственные образы:

    cd <*Assemblies location*>  
    
  3. В зависимости от операционной системы и конфигурации приложения может потребоваться создать собственные образы для 32-разрядной архитектуры, 64-разрядной архитектуры или для обоих.

    Для 32-разрядного выполнения:

    %WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install <Assembly name>  
    

    Для 64-разрядного запуска:

    %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install <Assembly name>  
    

Совет

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

NGen.exe также поддерживает другие функции, такие как удаление и отображение установленных собственных образов, очередь создания нескольких образов и т. д. Дополнительные сведения об использовании см. в документации NGen.exe.

Когда следует использовать NGen.exe

Когда речь идет о выборе сборок для создания собственных образов в приложении на основе EF версии 6 или более поздней, следует рассмотреть следующие варианты:

  • Основная сборка среды выполнения EF EntityFramework.dll: обычное приложение на основе EF выполняет значительный объем кода из этой сборки при запуске или первом доступе к базе данных. Следовательно, создание собственных образов этой сборки приведет к наибольшему повышению производительности запуска.
  • Любая сборка поставщика EF, используемая приложением: время запуска также может немного воспользоваться созданием собственных образов этих файлов. Например, если приложение использует поставщик EF для SQL Server, необходимо создать собственный образ для EntityFramework.SqlServer.dll.
  • Сборки и другие зависимости приложения. Документация NGen.exe охватывает общие критерии выбора сборок для создания собственных образов и влияния собственных образов на безопасность, расширенные параметры, такие как "жесткая привязка", такие как использование собственных образов в сценариях отладки и профилирования и т. д.

Совет

Тщательно измеряйте влияние использования собственных образов как на производительность запуска, так и на общую производительность приложения и сравнивайте их с фактическими требованиями. Хотя собственные образы, как правило, помогают повысить производительность запуска и в некоторых случаях сократить использование памяти, но не все сценарии будут действовать одинаково. Например, при устойчивом выполнении состояния (то есть после вызова всех методов, используемых приложением, по крайней мере один раз) код, созданный компилятором JIT, может на самом деле повысить производительность, чем собственные образы.

Использование NGen.exe на компьютере разработки

Во время разработки компилятор JIT .NET будет предлагать лучший общий компромисс для кода, который часто меняется. Создание собственных образов для скомпилированных зависимостей, таких как сборки среды выполнения EF, может помочь ускорить разработку и тестирование путем сокращения нескольких секунд в начале каждого выполнения.

Хорошее место для поиска сборок среды выполнения EF — это расположение пакета NuGet для решения. Например, для приложения с помощью EF 6.0.2 с SQL Server и назначения .NET 4.5 или более поздней версии можно ввести следующее в окне командной строки (не забудьте открыть его в качестве администратора):

cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll

Примечание.

Это позволяет использовать тот факт, что установка собственных образов для поставщика EF для SQL Server также по умолчанию установит собственные образы для основной сборки среды выполнения EF. Это работает, так как NGen.exe может обнаружить, что EntityFramework.dll является прямой зависимостью сборки EntityFramework.SqlServer.dll, расположенной в том же каталоге.

Создание собственных образов во время установки

Набор средств WiX поддерживает очередь создания собственных образов для управляемых сборок во время установки, как описано в этом руководстве. Другой альтернативой является создание настраиваемой задачи установки, которая выполняет команду NGen.exe.

Проверка использования собственных образов для EF

Вы можете убедиться, что конкретное приложение использует собственную сборку, найдите загруженные сборки с расширением .ni.dll или .ni.exe. Например, собственный образ для основной сборки среды выполнения EF будет называться EntityFramework.ni.dll. Простой способ проверить загруженные сборки .NET процесса — использовать Обозреватель процесса.

Другие вещи, которые следует учитывать

Создание собственного образа сборки не следует путать с регистрацией сборки в GAC (глобальный кэш сборок). NGen.exe позволяет создавать образы сборок, которые не находятся в GAC, и на самом деле несколько приложений, использующих определенную версию EF, могут совместно использовать один и тот же собственный образ. Хотя Windows 8 может автоматически создавать собственные образы для сборок, размещенных в GAC, среда выполнения EF оптимизирована для развертывания вместе с приложением, и мы не рекомендуем зарегистрировать его в GAC, так как это негативно влияет на разрешение сборок и обслуживание приложений среди других аспектов.