ワーカー スレッドを使用して大規模なアルゴリズムを高速化しようとしたときに、より多くのスレッドで独立した優先キューを使用すると実際にパフォーマンスが低下することに気付きました。そこで、小さなテストケースを書きました。
ここでは、開始するスレッドの数を照会し、各スレッドを独自のプロセッサに設定し、プライオリティ キューから多くのものをプッシュおよびポップします。各スレッドは独自の優先キューを所有しており、それらは個別に割り当てられているため、偽の共有は疑われません。
スニペットよりも長いため、ここにテスト ケースを配置します。(プロセッサ アフィニティ ビットはNCrunchから取得されます)
.NET にはビルトイン キューがなかったため、プライオリティ キューは私自身が作成したものです。違いが生じる場合は、ペアリング ヒープを使用します。
とにかく、1 つのスレッドと 1 つのコアでプログラムを実行すると、約 100% の使用率になります。 2 スレッド/2 コア で使用率が低下し、最終的には 8 コアすべてで 30% の使用率にまで低下します。
パフォーマンスの低下により、マルチスレッド化によるメリットがすべて無効になるため、これは問題です。パフォーマンスの低下の原因は何ですか? 各キューは他のスレッドから完全に独立しています