2011-12-23 11 views
0

.NETでは、JIT(ジャストインタイム)コンパイル手法を使用しています。つまり、まずソースコードをMSIL(中級言語)にコンパイルしてEXEを作成し、実行時にそのILを機械コードに変換します。それは正常に動作しますが、コンパイルされたコード全体がキャッシュにロードされず、何度も何度も繰り返し実行されます。私のアプリケーションは非常に時間に敏感です。何が起こっているのは、私が特定の関数を非常に頻繁に呼び出すと、do whileループを通して関数が10マイクロ秒以内に実行されるということです。しかし、同じ機能が、100ミリ秒以上の間隔の後に呼び出された場合、実行には50〜60マイクロ秒かかります。私はいくつかの特定の関数/プロシージャが常にキャッシュに残るようにしたい。誰でも案内できますか?私はこれがJITのために起きていると思います。 JITをオフにして、コードを機械語などに直接コンパイルできますか?助けてください。.NETアプリケーションでJITコンパイルをオフにすることはできますか?

+0

JITerがどのように機能するかについてのあなたの理論はかなり間違っています。あなたはどこでこのように動作することを知りましたか?それは間違ったものを最適化し、あなたにウサギの道を導いています。いいえ、機械語に直接コンパイルすることはできません。いいえ、あなたはそれをオフにしたくありません。 –

答えて

3

関数が最初にJITされると、プロセスが実行されている間は決して忘れられません。それは、ILからネイティブへのコンパイルのために時間がかかる唯一の最初の呼び出しです。最悪のシナリオは、システムのRAMが不足すると、ネイティブコードがスワップアウトされる可能性があるということです。それははあなたの問題を解決することはありませんが、

あなたは、ngenを実行し、GACにプリコンパイルされたネイティブイメージを配置することによって、JITコンパイルをスキップすることができます。 50-60マイクロ秒の時間を要するコードがタイムクリティカルな場合は、最初に.NETを使用するべきではありません.JITではなく、管理されたスレッドによっていつでも起動されるGCが原因です。

1

.NETはILを「解釈」しないため、いいえ、JITをオフにすることはできません。マシンコードにコンパイルする必要があります。これはJITterによって行われます。

できることは、あらかじめコンパイルすることです。これはngenで行われます。 http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

関連する問題