いくつかのタイミング測定を実行するC#プログラムがあります。残念ながら、JIT(Just-In-Time)コンパイルの可能性があるため、最初に計測するのは2回目以降の20倍です。C#では、起動時に、JITコンパイラがアプリケーション全体のすべてのMSILコードに触れるように強制する方法はありますか?
起動時に、アプリケーション全体のMSILコードのすべての行がJITコンパイラでコンパイルされるようにする方法はありますか?
いくつかのタイミング測定を実行するC#プログラムがあります。残念ながら、JIT(Just-In-Time)コンパイルの可能性があるため、最初に計測するのは2回目以降の20倍です。C#では、起動時に、JITコンパイラがアプリケーション全体のすべてのMSILコードに触れるように強制する方法はありますか?
起動時に、アプリケーション全体のMSILコードのすべての行がJITコンパイラでコンパイルされるようにする方法はありますか?
答えがNGENを使用している可能性があります。これはあなたのアセンブリをプリジットし、実行しているプラットフォームのネイティブコードに変換するツールです。
このため、アプリケーションのセットアップ段階で実行されることがよくあります。
http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.71).aspx
実行可能ファイルのエントリにngen.exeを呼び出す関数の記述を終了しました。これにより、すべてのサブアセンブリが自動的にJITされます。この技法は美しく機能します。 – Contango
それは素晴らしいニュースです! –
コメントに@ta.speot.isによって提案された、またはhis answerで@Russ CによりとしてあなたがNGENを使用できない場合は、別の方法は、「ウォームアップ」することです:
MSDNはこちらのガイドを持っていますコードのJITter。
基本的に、性能測定を行うためにコードを1000回呼び出すと、実際の測定を行う前に、タイミングを取らずにすべてのコードをJITするだけで一度呼び出すことができます。
ie。このようなもの:
MethodUnderTest();
Stopwatch sw = Stopwatch.StartNew();
for (int index = 0; index < 1000; index++)
MethodUnderTest();
sw.Stop();
ただの理論: 'ngen'それ? –
もちろん、正確*タイミングです。本当に何が起こっているのかを無視するのは良い考えではありません。 Ngenは万能薬ではありません。遅いスタートアップは、コールドスタート*、ディスク上のDLLを見つける努力によって引き起こされる可能性があります。 Ngenは実際にそれらを悪化させ、見つけ出すDLLを増やします。組み立てが小さい場合、ジッタはDLLを見つけるよりも速くなります。 –