2

10000 を超える要素のコレクションで PLINQ を使用しています... シーケンシャル クエリと比較してパフォーマンスが得られません。

私のシステム構成は次のとおりです: OS - Windows 7 32 ビット、プロセッサ - Intel Core2Duo。

適切なパフォーマンスが得られないのを助けてください。

クエリは次のとおりです。

ParallelQuery<int> j = Enumerable.Range(0, 1000000).AsParallel();
var sss =  j.Where(o => o%2 == 0);
4

2 に答える 2

4

タスクは非常に軽量であるため、スレッド コンテキストの切り替えによって大きなオーバーヘッドが発生します。軽量タスクを、より多くの作業量を伴うバッチにグループ化することで、状況を改善できます。これは、PLinq のパーティショニング サポートを使用して実現できます。次の質問を参照してください。

並列操作のバッチ処理

タスクをグループ化することで、管理オーバーヘッドが少なくなるため、複数のスレッドをより有効に活用できます。

既存のコード例では、指ぬきを使って井戸から水を汲むのに似ています。タスクをグループ化することは、バケツを使用することに似ています。

于 2011-01-29T11:37:11.440 に答える
2

タスクがスレッド間で分割されている場合でも、スレッドの呼び出しのオーバーヘッドは、単純に順次実行する以上のものになることがよくあります。

この場合、非常に単純な計算を行っているため、各操作は 10 ナノ秒未満であり、L1 および L2 キャッシュを非常にうまく利用しています。スレッドを導入すると、起動コストが比較的高くなります。これは、何らかの処理を待機している間、スレッドがスリープしているためです。

PLINQ および TPL のカスタム パーティショナーをご覧ください。

于 2011-01-29T12:09:10.333 に答える