14

私はC#(基本的にはマルチトラックエディター)でDSPアプリケーションを書いています。私はかなり長い間さまざまなマシンでプロファイリングを行ってきましたが、いくつかの「奇妙な」ことに気づきました。

私の自宅のマシンでは、再生ループの最初の実行は利用可能な時間の約50%〜60%を占め(JITがその仕事をしているためだと思います)、その後のループでは安定した5になります。 % 消費。問題は、低速のコンピューターでアプリケーションを実行すると、最初の実行に使用可能な時間よりも多くの時間がかかり、再生が中断され、出力オーディオが混乱することです。これは許容できません。その後、消費量は8%〜10%になります。

最初の実行後も、アプリケーションは時間のかかるルーチンを時々(2秒ごとに)呼び出し続けます。これにより、5%の安定した消費で、20%〜25%の非常に短いピークが発生します。アプリケーションをしばらく実行すると、これらのピークも7%〜10%に低下することに気づきました。(JITがコードのこれらの部分を再コンパイルしたことが原因かどうかはわかりません)。

ですから、私はJITに深刻な問題を抱えています。アプリケーションは非常に遅いマシンでも正常に動作しますが、これらの「コンパイルストーム」は大きな問題になります。私はこの問題を解決する方法を見つけようとしていて、起動時に事前にアプリケーションに「スクイーズ」するようにアプリケーションに指示する属性ですべての「賢明な」ルーチンをマークするというアイデアを思いつきました。 、したがって、本当に必要なときに完全に最適化されます。しかし、これは単なるアイデアであり(私もあまり好きではありません)、問題全体に対してより良い解決策があるのではないかと思います。

皆さんのご意見をお聞かせください。

(NGENアプリケーションはオプションではありません。私は、取得できるすべてのJIT最適化が好きで欲しいです。)

編集:

メモリ消費とガベージコレクションのキックは問題ではありません。オブジェクトプールを使用しており、再生中のメモリの最大ピークは304Kbです。

4

4 に答える 4

17

PrepareMethod... メソッドを使用して (を使用せずに) 、アプリケーションの初期化ルーチン中にアセンブリのセット全体をコンパイルするように JIT コンパイラをトリガーできますNGen

このソリューションについては、実行時に JIT コンパイルを強制する で詳しく説明しています。

于 2010-08-03T19:45:23.573 に答える
4

初速度は確かにFusion+JITのように聞こえますが、これはILMerge(Fusionの場合)とNGEN(JITの場合)によって支援されます。起動時にシステム全体でサイレントトラックをいつでも再生できるので、ユーザーが歪みに気付くことなく、すべてのハードワークを実行できますか?

NGENは良いオプションです。使えない理由はありますか?

初期ロードに言及した問題は、JITに関連しているようには聞こえません。おそらくガベージコレクション。

プロファイリングを試しましたか?CPUとメモリ(コレクション)の両方?

于 2009-04-15T11:12:17.977 に答える
2

JIT の影響を受けていると思われる場合は、NGEN を使用してアプリをプリコンパイルし、テストを再度実行してください。NGEN によってコンパイルされたコードには JIT オーバーヘッドはありません。NGEN を適用したアプリで引き続きスパイクが見られる場合は、JIT が原因ではないことがわかります。

于 2010-08-03T19:56:26.437 に答える