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