web-dev-qa-db-ja.com

ngen.exeはいつどのように機能しますか?

JIT以前のコンパイル(ngen.exe)の利点を知りたい。 Native Image Generator (NGen)プロセスの役割は何ですか?なぜそれが必要なのですか?

例を挙げてください。

19
Dhiren

.NETプラットフォームでコードを実行するには、 Common Intermediate Language (CIL)表現をマシンコードに変換する必要があります。これが実行の直前に発生する場合、これはJIT(Just In Time)コンパイルと呼ばれます。 JITの出力は永続化されないため、管理対象アプリケーションは起動するたびにJITを経由する必要があります。

または、プリコンパイルを使用して、JITコンパイルに関連する起動オーバーヘッドを減らすことができます。 NGenはプリコンパイルを実行し、ネイティブイメージをネイティブイメージキャッシュに保持します。その後、アプリケーションはネイティブイメージで実行でき、JITコンパイルのオーバーヘッドが減少するため、起動時間が短縮される場合があります。当初、NGenはインストール時のテクノロジーでした。開発者はアプリケーションインストーラーにNGenコマンドを発行させて、インストール時にプリコンパイルをトリガーしました。詳細については、NGenが強力な新機能でパフォーマンスを向上させるをご覧ください。この記事では、NGenを活用するサンプルアプリケーションを紹介します。

Windows 8(.NET 4.5)では、新しいNGenモード「Auto NGen」が導入されました。基本的に、.NETランタイムは管理対象アプリケーションの使用状況ログを生成します。システムがアイドル状態の場合、自動メンテナンスタスクがバックグラウンドで実行され、ネイティブイメージが生成されます。これにより、開発者はNGenを明示的に扱う必要がなくなります。この機能は、ウィンドウストアをターゲットにするか、 [〜#〜] gac [〜#〜] を使用する.NET 4.5+アプリケーションでのみ有効になることに注意してください。こちらが役立つ可能性のあるMSDNページです:Creating Native Images

そして、これはNGenおよび関連技術の高レベルの概要です:速度の必要性を得ましたか? .NETアプリケーションの起動が速くなります

最後に、.NETフレームワークライブラリ自体はNGenを使用してパフォーマンスを向上させています。 .NET Frameworkがサービスされると、一部のネイティブイメージが無効になります。次に、NGenを実行して、無効なネイティブイメージを再生成する必要があります。これは、アイドル時に実行される.NETランタイム最適化サービスを介して自動的に行われます。

31
m_eric

.NET compilation flow

.NETコンパイラがC#またはVB.NETコードをコンパイルすると、半分コンパイルされて [〜#〜] cil [〜#〜] コードが作成されます。この半分コンパイルされた.NET EXEファイルを実行すると、JITがバックグラウンドで実行され、半分のCILコードが完全なマシン言語にコンパイルされます。このモードは通常のJITと呼ばれます。

完全にコンパイルされたEXEファイルを実行することにより、ランタイムコンパイルが不要であると逆に言うこともできます。このコンパイルは、negen.exeを使用して行われます。このシナリオでは、JITは実行時に参加しません。これはpre-JITモードと呼ばれます。

それらがパフォーマンスにどのように影響するかを確認したい場合は、通常のJITおよびJIT前のコンパイルモードを示すこのYouTubeビデオを見ることができます。

JIT、Ngen.exe、プレジット、通常ジット、エコノジットを説明しますか?(.NETインタビューの質問)

7

[〜#〜] msdn [〜#〜]

ネイティブイメージジェネレーター(Ngen.exe)は、管理対象アプリケーションのパフォーマンスを向上させるツールです。 Ngen.exeは、ネイティブイメージ(コンパイルされたプロセッサ固有のマシンコードを含むファイル)を作成し、ローカルコンピューターのネイティブイメージキャッシュにインストールします。ランタイムは、ジャストインタイム(JIT)コンパイラーを使用する代わりに、キャッシュからのネイティブイメージを使用して、元のアセンブリをコンパイルできます。

ソフトウェアの起動が速くなるように、以前はインストール中にNGENを使用しました。

2
BryanJ

NGen (ネイティブイメージジェネレーター)は基本的に.NETバイトコード( [〜#〜] cil [〜#〜] )を実行しているコンピューターのネイティブコードにコンパイルします。利点は、コードを毎回ネイティブにコンパイルするのではなく、それを実行するか必要とするのではなく、一度だけ実行することで、アプリケーションの起動と実行が速くなることです。より多くの情報が必要な場合は、JITとAhead of Time Compilationの利点(NGenが行うこと)に関するリソースが豊富にあります。

1
Rafael