コードが常に特定のプロセッサで実行される場合、インストール中にこの情報があれば、JIT を回避できる可能性はありますか?
3 に答える
NGENを使用します。
Native Image Generator (Ngen.exe) は、マネージ アプリケーションのパフォーマンスを向上させるツールです。Ngen.exe は、コンパイルされたプロセッサ固有のマシン コードを含むファイルであるネイティブ イメージを作成し、ローカル コンピューターのネイティブ イメージ キャッシュにインストールします。ランタイムは、ジャストインタイム (JIT) コンパイラを使用して元のアセンブリをコンパイルする代わりに、キャッシュからネイティブ イメージを使用できます...
Ngen.exe とネイティブ イメージ サービスの使用に関する追加情報については、「ネイティブ イメージ サービス...」を参照してください。
NGEN は明白な答えですが、NGEN ではできないことを実行時に "認識" しているため、JIT 化されたコードの方が高速になる可能性があることを指摘しておきます。その事実を利用して、.config ファイルの設定に基づいて、実行時に文字通りコード行をフロアにドロップします。
static readonly bool _EnableLogging = LoadFromConfigFile("EnableLogging");
if (_EnableLogging && log.IsDebugEnabled)
{
//Do some logging
}
この例では、NGEN は _EnableLogging フィールドの値がわからないため、if ステートメントをコードに残す必要があります。ただし、JIT はこの実行の値を認識しており、それが false の場合、if ステートメントが処理されることはありません。JIT は、生成するマシン コードから if ステートメント全体を文字通り省略し、コードベースを小さくします。したがって、より高速なコードベース。
インストール時に CPU 情報があれば、JIT を避ける必要はありません。
/platform:[x86/x64/IA64] スイッチを使用してモジュールをコンパイルすると、CLR がコードを適切な CPU ネイティブ コードに JIT し、そのためにコードを最適化できるように、コンパイラは結果の PE ファイルにこの情報を含めます。 CPU アーキテクチャ。
はい、 NGENを使用できますが、JITting を回避したためではなく、実行中のプロセスのワーキング セットが減少した結果として、アプリケーションの起動を改善したい場合に限ります。また、NGEN 化されたファイルのパフォーマンスを NGEN 化されていないファイルのパフォーマンスと実際に比較して、NGEN 化されたファイルの方が高速であることを確認する必要があります。
NGEN は、JIT コンパイラが実行できるほど多くの実行環境に関する仮定を行うことができないため、最適化されていないコードを生成します。
たとえば、静的フィールドの実際のアドレスは実行時にしか分からないため、静的フィールドへのアクセスに間接性が追加されます。