NGen を使用した起動時のパフォーマンスの向上Improving startup performance with NGen

注意

EF6 以降のみ - このページで説明する機能、API などは、Entity Framework 6 で導入されました。EF6 Onwards Only - The features, APIs, etc. discussed in this page were introduced in Entity Framework 6. 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。If you are using an earlier version, some or all of the information does not apply.

.NET Framework は、アプリケーションの起動を高速化する手段として、マネージアプリケーションとライブラリのネイティブイメージの生成をサポートしています。また、場合によっては、使用するメモリが少なくなります。The .NET Framework supports the generation of native images for managed applications and libraries as a way to help applications start faster and also in some cases use less memory. ネイティブイメージは、マネージコードアセンブリをアプリケーションの実行前にネイティブコンピューター命令を含むファイルに変換することによって作成されます。これにより、.NET JIT (Just-in-time) コンパイラは、アプリケーションランタイムでネイティブ命令を生成する必要がなくなります。Native images are created by translating managed code assemblies into files containing native machine instructions before the application is executed, relieving the .NET JIT (Just-In-Time) compiler from having to generate the native instructions at application runtime.

Version 6 より前のバージョンでは、EF ランタイムのコアライブラリは .NET Framework に含まれており、ネイティブイメージは自動的に生成されました。Prior to version 6, the EF runtime’s core libraries were part of the .NET Framework and native images were generated automatically for them. バージョン6以降では、EF ランタイム全体が EntityFramework NuGet パッケージに結合されています。Starting with version 6 the whole EF runtime has been combined into the EntityFramework NuGet package. 同様の結果を得るには、NGen.exe コマンドラインツールを使用してネイティブイメージを生成する必要があります。Native images have to now be generated using the NGen.exe command line tool to obtain similar results.

経験上の観察は、EF ランタイムアセンブリのネイティブイメージが、アプリケーションの起動時間の 1 ~ 3 秒間を切ることができることを示しています。Empirical observations show that native images of the EF runtime assemblies can cut between 1 and 3 seconds of application startup time.

NGen.exe の使用方法How to use NGen.exe

NGen.exe ツールの最も基本的な機能は、アセンブリとそのすべての直接の依存関係のネイティブイメージを "インストール" (つまり、ディスクに保存) することです。The most basic function of the NGen.exe tool is to “install” (that is, to create and persist to disk) native images for an assembly and all its direct dependencies. これを実現する方法を次に示します。Here is how you can achieve that:

  1. 管理者としてコマンド プロンプト ウィンドウを開きます。Open a Command Prompt window as an administrator.

  2. 現在の作業ディレクトリを、ネイティブイメージを生成するアセンブリの場所に変更します。Change the current working directory to the location of the assemblies you want to generate native images for:

    cd <*Assemblies location*>  
    
  3. オペレーティングシステムとアプリケーションの構成によっては、32ビットアーキテクチャ、64ビットアーキテクチャ、またはその両方のネイティブイメージを生成することが必要になる場合があります。Depending on your operating system and the application’s configuration you might need to generate native images for 32 bit architecture, 64 bit architecture or for both.

    32ビットの場合は、次のように実行します。For 32 bit run:

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

    64ビットの場合は、次のように実行します。For 64 bit run:

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

ヒント

間違ったアーキテクチャのネイティブイメージを生成するのは非常に一般的な間違いです。Generating native images for the wrong architecture is a very common mistake. 確信が持てない場合は、コンピューターにインストールされているオペレーティングシステムに適用されるすべてのアーキテクチャのネイティブイメージを簡単に生成できます。When in doubt you can simply generate native images for all the architectures that apply to the operating system installed in the machine.

また NGen.exe は、インストールされているネイティブイメージのアンインストールと表示、複数のイメージの生成のキューなどの他の機能もサポートします。使用法の詳細については、 NGen.exe のドキュメントを参照してください。NGen.exe also supports other functions such as uninstalling and displaying the installed native images, queuing the generation of multiple images, etc. For more details of usage read the NGen.exe documentation.

NGen.exe を使用する場合When to use NGen.exe

EF バージョン6以降に基づくアプリケーションでネイティブイメージを生成するアセンブリを決定する際には、次のオプションを考慮する必要があります。When it comes to decide which assemblies to generate native images for in an application based on EF version 6 or greater, you should consider the following options:

  • 主 ef ランタイムアセンブリ EntityFramework.dll: 一般的な ef ベースのアプリケーションは、起動時またはデータベースへの最初のアクセス時にこのアセンブリから大量のコードを実行します。The main EF runtime assembly, EntityFramework.dll: A typical EF based application executes a significant amount of code from this assembly on startup or on its first access to the database. そのため、このアセンブリのネイティブイメージを作成すると、起動時のパフォーマンスが最大になります。Consequently, creating native images of this assembly will produce the biggest gains in startup performance.
  • アプリケーションによって使用される EF プロバイダーアセンブリ: 起動時間は、これらのネイティブイメージを生成する場合と若干同じ効果があります。Any EF provider assembly used by your application: Startup time can also benefit slightly from generating native images of these. たとえば、アプリケーションで SQL Server に EF プロバイダーを使用する場合は、EntityFramework.SqlServer.dll のネイティブイメージを生成する必要があります。For example, if the application uses the EF provider for SQL Server you will want to generate a native image for EntityFramework.SqlServer.dll.
  • アプリケーションのアセンブリとその他の依存関係: NGen.exe のドキュメント では、ネイティブイメージを生成するアセンブリを選択するための一般的な条件と、セキュリティ上のネイティブイメージの影響、"ハードバインディング" などの高度なオプション、デバッグとプロファイルのシナリオでのネイティブイメージの使用などのシナリオなどについて説明します。Your application’s assemblies and other dependencies: The NGen.exe documentation covers general criteria for choosing which assemblies to generate native images for and the impact of native images on security, advanced options such as “hard binding”, scenarios such as using native images in debugging and profiling scenarios, etc.

ヒント

起動時のパフォーマンスとアプリケーションの全体的なパフォーマンスの両方でネイティブイメージを使用した場合の影響を慎重に測定し、実際の要件と比較してください。Make sure you carefully measure the impact of using native images on both the startup performance and the overall performance of your application and compare them against actual requirements. 一般にネイティブイメージは起動時のパフォーマンスの向上に役立ちますが、場合によってはメモリ使用量が少なくなることがありますが、一部のシナリオでは同等のメリットが得られません。While native images will generally help improve startup up performance and in some cases reduce memory usage, not all scenarios will benefit equally. たとえば、安定した状態で実行した場合 (つまり、アプリケーションによって使用されているすべてのメソッドが少なくとも1回呼び出された場合)、JIT コンパイラによって生成されるコードはネイティブイメージよりも若干優れたパフォーマンスをもたらします。For instance, on steady state execution (that is, once all the methods being used by the application have been invoked at least once) code generated by the JIT compiler can in fact yield slightly better performance than native images.

開発用コンピューターでの NGen.exe の使用Using NGen.exe in a development machine

開発中は、.NET JIT コンパイラによって、頻繁に変更されるコードに対する全体的なトレードオフが最適になります。During development the .NET JIT compiler will offer the best overall tradeoff for code that is changing frequently. EF runtime アセンブリなど、コンパイルされた依存関係のネイティブイメージを生成すると、各実行の開始時に数秒を減らすことで、開発とテストの時間を短縮できます。Generating native images for compiled dependencies such as the EF runtime assemblies can help accelerate development and testing by cutting a few seconds out at the beginning of each execution.

EF ランタイムアセンブリを見つけるための最適な場所は、ソリューションの NuGet パッケージの場所です。A good place to find the EF runtime assemblies is the NuGet package location for the solution. たとえば、SQL Server で EF 6.0.2 を使用し、.NET 4.5 以降を対象とするアプリケーションの場合は、コマンドプロンプトウィンドウで次のように入力できます (管理者として開くことを忘れないでください)。For example, for an application using EF 6.0.2 with SQL Server and targeting .NET 4.5 or greater you can type the following in a Command Prompt window (remember to open it as an administrator):

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

注意

これにより、SQL Server 用の EF プロバイダーのネイティブイメージをインストールするときに、メインの EF runtime アセンブリのネイティブイメージも既定でインストールされるという事実を活用できます。This takes advantage of the fact that installing the native images for EF provider for SQL Server will also by default install the native images for the main EF runtime assembly. これは、EntityFramework.dll が同じディレクトリにある EntityFramework.SqlServer.dll アセンブリの直接の依存関係であることを NGen.exe が検出できるために機能します。This works because NGen.exe can detect that EntityFramework.dll is a direct dependency of the EntityFramework.SqlServer.dll assembly located in the same directory.

セットアップ時のネイティブイメージの作成Creating native images during setup

WiX Toolkit は、この ハウツーガイドで説明されているように、セットアップ時にマネージアセンブリのネイティブイメージの生成をキューによってサポートします。The WiX Toolkit supports queuing the generation of native images for managed assemblies during setup, as explained in this how-to guide. 別の方法として、NGen.exe コマンドを実行するカスタムセットアップタスクを作成することもできます。Another alternative is to create a custom setup task that execute the NGen.exe command.

EF でネイティブイメージが使用されていることを確認していますVerifying that native images are being used for EF

特定のアプリケーションがネイティブアセンブリを使用していることを確認するには、拡張子が ".ni.dll" または ".ni.exe" の読み込み済みアセンブリを探します。You can verify that a specific application is using a native assembly by looking for loaded assemblies that have the extension “.ni.dll” or “.ni.exe”. たとえば、EF のメインランタイムアセンブリのネイティブイメージは EntityFramework.ni.dll として呼び出されます。For example, a native image for the EF’s main runtime assembly will be called EntityFramework.ni.dll. プロセスの .NET アセンブリを確認する簡単な方法は、 プロセスエクスプローラーを使用することです。An easy way to inspect the loaded .NET assemblies of a process is to use Process Explorer.

その他の注意点Other things to be aware of

アセンブリのネイティブイメージの作成は、アセンブリをGAC (グローバルアセンブリキャッシュ)に登録する場合と混同しないようにしてくださいCreating a native image of an assembly should not be confused with registering the assembly in the GAC (Global Assembly Cache). NGen.exe では、GAC にないアセンブリのイメージを作成できます。実際には、特定のバージョンの EF を使用する複数のアプリケーションが同じネイティブイメージを共有できます。NGen.exe allows creating images of assemblies that are not in the GAC, and in fact, multiple applications that use a specific version of EF can share the same native image. Windows 8 では、GAC に配置されたアセンブリのネイティブイメージを自動的に作成できますが、EF ランタイムはアプリケーションと共に配置するように最適化されています。また、アセンブリの解決に悪影響を及ぼし、アプリケーションを他の側面でサービスするため、GAC に登録することはお勧めしません。While Windows 8 can automatically create native images for assemblies placed in the GAC, the EF runtime is optimized to be deployed alongside your application and we do not recommend registering it in the GAC as this has a negative impact on assembly resolution and servicing your applications among other aspects.