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

Примечание

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

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

до версии 6 основные библиотеки среды выполнения EF были частью платформа .NET Framework и образы в машинном кодах были автоматически созданы для них. начиная с версии 6, вся среда выполнения EF объединена в пакет EntityFramework NuGet. Образы в машинном коде должны быть созданы с помощью средства командной строки 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 позволяет создавать образы сборок, которые не находятся в глобальном кэше сборок, и на самом деле несколько приложений, использующих определенную версию EF, могут совместно использовать один и тот же образ в машинном коде. хотя Windows 8 может автоматически создавать образы в машинном коде для сборок, размещенных в глобальном кэше сборок, среда выполнения EF оптимизирована для развертывания вместе с приложением, и мы не рекомендуем его регистрировать в глобальном кэше сборок, так как это отрицательно сказывается на разрешении сборок и обслуживании приложений среди других аспектов.