私は、マルチスレッドを頻繁に使用するパフォーマンスクリティカルな.NETアプリケーションを作成しています。 Visual Studioのパフォーマンス・プロファイラを使用して多量のマルチスレッドアプリケーションのプロファイリング/最適化
、独占サンプルでトップの機能は以下のとおりです。
WaitHandle.WaitAny()
- 14.23パーセント
@[email protected]
から7.76パーセント
Monitor.Enter
から5.09パーセント
基本的には、私のトップ3の関数は、スレッドプリミティブで動作しています。私の仕事/処理ルーチンはかなり小さく、パフォーマンスを向上させようとしています。私はかなり頻繁にそれらを見直しているが、関係するアルゴリズムはかなり健全であると私は信じる。
私の質問は以下のとおりです。
- CPUサンプルの14.23パーセントは、これらの方法である場合 - すなわち、単に他のスレッドを待っている、これらのサンプルのほとんどのために効果的に「アイドル」CPUのですか?または、プロファイルトレースの一部として表示されていないスレッド待ちのアイドル部分[これら3つの同期方法のすべてのオーバーヘッドの合計は27.08%です。しかし、これらの結果は、私がさらにためになるはずですいくつかの特定のボトルネックや技法を示し行う、(私はこれがほとんどアイドル状態であることを推測することができますが、この1してくださいへの回答の背後にあるいくつかのまともな参考資料をいただければ幸いです)私は私のロックスキームを検討している
- 最適化?
WaitAny
は特に不良ですか?特定のキューオブジェクトが読み書き可能であるかどうかを確認するために大量に使用しますが、同時にアボートフラグもチェックします。それを行う良い方法はありますか?
あなたがそれらのプリミティブを使用する方法かもしれません。 –
@Henk - 確かに、自分のアルゴリズムを見直して、スキームをロックすると言うことで言い訳しようとしました –
@KierenJohnstone VS 2010をお持ちの方は、これに並行プロファイラ/ビジュアライザを使用してください。 –