JITとNGenの違いを理解しようとしています。助けてください。JITはバイナリコードをキャッシュしますか?はいの場合、NGenはコールドランのパフォーマンスのみを改善できることを意味します。しかし、私は反対のことを言っているいくつかの記事を読みました:NGenはウォームスタートアップだけを大幅に改善します。
2 に答える
正反対です。アセンブリはファイルシステムキャッシュになく、ディスク上で見つける必要があるため、コールドスタートはウォームスタートよりも時間がかかります。これは、メカニカルディスクドライブでは非常に遅くなる可能性があります。NGenは、ngenされたアセンブリごとに、ディスク上に追加のファイルを作成します。これは、事前に調整されたマシンコードを含む.ni.dllファイルです。このファイルは、元のアセンブリに加えて検索してロードする必要があり、その特定のアセンブリのコールドスタートのコストが約2倍になります。
したがって、設計上、NGenはプログラムのウォームスタートを確実に改善することしかできず、コールドスタートの一部を悪化させてプログラムを遅くします。コールドスタートの場合は、起動時のジッターにかかる時間が.ni.dllファイルの検索に必要な時間よりも長い場合にのみ先に進みます。もちろん、これはディスクのパフォーマンスに大きく依存するため予測が非常に難しく、開始前に1ショットしかないため、測定が非常に困難です。
実験する必要があります。大まかな目安として、アセンブリは「実質的」であり、GACに格納され、複数のプロセスで使用される場合、ngenに追加の理由があります。これにより、事前に作成されたコードを複数のプロセスで1回だけRAMにロードできるようになります。
.NET JITは、プロセス間でマシンコードをキャッシュしません(セキュリティと正確性の理由から、アセンブリが変更され、保存されているマシンコードが編集される可能性があります。これらは解決が難しい問題です)。すべてのプロセスで、マシンコードが新たに作成されます。
そのため、NGENはコールドスタートアップとホットスタートアップのロード時間を改善します。