2012-01-12 10 views
2
partiioning

タスクParallel.For Parallel.ForEachロードバランシング、ネット

が内部的に自分の負荷分散とパーティショニングを提供し、平行方法Parallel.ForとParallel.ForEachは、パフォーマンスが向上するのですか?

もしそうなら、パフォーマンスを向上させるためにPartitionerクラスを使用して独自のパーティションを作成したい場合はどうしますか?

答えて

3

ルーチンは独自のパーティションを提供しています。

これらは「標準的な」シナリオに基づいていますが、特に異常な状況ではガイダンスが必要な場合があります。

たとえば、実装のデフォルトのパーティション化(IList<T>を実装しない)は、タスクごとに小さなグループから開始され、サイズが徐々に大きくなります。しかし、IEnumerable<T>が一度に1つの項目をゆっくりとフィードすることがわかっている場合は、Parallelクラスがパーティションの要素を十分に受け取ってスケジュールするまで、次の項目を待機します。

独自のパーティショナーを提供することで、これを防ぎ、より良いスループットを得ることができます。

カスタムパーティショナーが役立つもう1つの素晴らしい例は、ループアイテムごとの作業量が非常に少ない場合です。この場合、自分でパーティションを作成してパーティションで作業することで、不必要なオーバーヘッドが回避されます。これについては、MSDNのHow to: Speed Up Small Loop Bodiesページを参照してください。