32

そのため、CLR ランタイムが .NET アセンブリを読み込むと、それがマシン ネイティブ コードにコンパイルされます。このプロセスは JITing と呼ばれます。NGen は、.NET アセンブリをネイティブ コードにコンパイルするプロセスでもあります。2つの違いは何ですか?

4

5 に答える 5

32

違いはそれらがいつ発生するかです。JIT コンパイルは、プログラムの実行中に発生します。NGen は通常、プログラムのインストール時に行われ、プログラムが実行される前に行われます。NGen の目標の 1 つは、アプリケーションの起動時に JIT ペナルティを取り除くことです。

于 2011-04-02T18:40:17.453 に答える
16

JIT はメソッドごとにのみ実行されます。すべてをJITするわけではありません...必要なビットのみ。もちろん、これはメソッド (およびジェネリックなど) への初回のヒットは小さくても測定可能です。NGEN はこの作業を事前に行いますが、同じプラットフォーム/アーキテクチャなどで行う必要があります - 基本的にそのマシン. これは、GACなどに追加することも意味します。これには、より高いアクセスが必要になる場合があります。

多くの場合、特にアプリが長時間開いている場合 (Web サーバーなど)、JIT は問題ありません。

于 2011-04-02T18:41:29.747 に答える
9

まだ言及されていない非常に重要な違いの 1 つは、ネイティブ キャッシュ イメージに「共有コード ページ」があることです。これにより、ターミナル サービスまたは Citrix で実行されるアプリケーションのメモリ フットプリントに大きな違いが生じます。

NGEN について理解しておくべき重要なことは、NGEN はコードをコンパイルしている間、コード ページを共有可能としてマークし、アプリケーションの複数のインスタンスが最初のインスタンスによって使用されるメモリ空間の一部を共有できることです。これは、ターミナル サービスで実行している場合に非常に便利です。

http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx .

これは、複数のユーザーがプロセス間でメモリを共有するため、1 台のマシンで複数のユーザーが使用するアプリケーションにとって非常に重要な意味を持ちます。これは、画像キャッシュが適切に維持されていない場合、非常に奇妙で再現が困難な動作やリソース管理の問題につながる可能性があります。

于 2012-10-30T13:20:28.003 に答える
7

MSDN から...

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

http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

基本的に、NGen では事前 JIT を実行し、アセンブリをローカル マシンにキャッシュできます。これにより、起動が高速になり、場合によっては実行が可能になります。

于 2011-04-02T18:39:41.203 に答える
3

ここには多くの詳細が残されていますが、次のとおりです。

Jit はそうではありません... Jit は Just-In-Time です。つまり、メソッドなどのコードが実際に呼び出されるまで、ネイティブ コードにコンパイルされません。それまではスタブしかありません。これはキャッシュされたままになるため、メソッドへの後続の呼び出しでネイティブ コードが再生成されません。

NGen はアセンブリ全体を一度に実行します。NGen はすべてを一度に行うため、Jitting は必要ありません。

于 2011-04-02T18:41:36.237 に答える