2011-11-01 8 views
7

コードが最初に呼び出されるのを待つのではなく、C#のコードを前方にJITする簡単な方法はありますか?私はNGENについて読んだことがあるが、それが私を助けてくれるとは思わない。C#JITのオーバーヘッドを避ける

私のアプリケーションは、UDPポートから来る特定の外部イベントを待って応答し、クリティカルパスコードは(a)イベントが到着する前に実行されません。(b)再度実行されるため、このシナリオではJITが高いです。 ANTSプロファイラで確認すると、JITのオーバーヘッドは約40〜50%ですが、時には90%にもなります。私のアプリケーションは待ち時間に非常に敏感で、ミリ秒ごとにカウントされます。

最初の考えでは、JITコンパイルを開始するために、すべてのクリティカルパスメソッドにブールパラメータを追加し、イベントが発生する前にこれらのメソッドを呼び出すことができたと思います。しかし、もっときれいな方法がありますか?

多くのお礼ありがとうございます

+10

なぜNGENはあなたを助けませんか? –

+2

問題があると判断しましたか?それとも、あなたは単にそれがあると思いますか? –

+0

私は(事実上)ヘンクの問題だと確信しています。私はただの方法で私のハックのアプローチを実装し、ANTSプロファイラのそのメソッドのJITオーバーヘッドは消えました。 – endian

答えて

5

NGENを使用しても問題が解決しない場合は、より深刻な問題が発生する可能性があります。

しかし、あなたの質問に答えるには、pre-jitへのこの記事では、System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethodを使用してJITを強制します。これには、リフレクションを使用してメソッドハンドルを取得するためのサンプルコードが含まれています。

+2

優秀、ありがとう。私は、PrepareMethodを呼び出すCodeProject(!)記事も見つけました。リンク先:http://www.codeproject.com/KB/dotnet/Jitting.aspx – endian

3

イベントが2回目に届きましたか?それは速いか遅いかです。コードが "JIT"を一度しか取得しないため、JITがまだ遅い場合は問題はありません。

NGENが回答を提供します。私の提案は、あなたが必要とするクリティカルな最小限のコードとクリティカルパスをダミー/サンドボックスプロジェクトに入れることです。このコードのプロファイリング/ NGenningを開始し、パフォーマンスを確認します。

NGENが実行された後でも、この最低限のコードが複数の呼び出しでうまく動作しない場合、プリコンパイルは役に立ちません。パフォーマンスのボトルネックを引き起こしているコード内の何か他のもの。

+0

コードは、最初のイベントの後で高速です。上記のように、パフォーマンス上の問題を引き起こすのは間違いなくJITオーバーヘッドであることがわかりました。私はRuntimeHelpers.PrepareMethodへの呼び出しの負荷を追加中です。うまくいけば、この問題が取り除かれます。 – endian

関連する問題