は タスクParallel.For Parallel.ForEachロードバランシング、ネット
が内部的に自分の負荷分散とパーティショニングを提供し、平行方法Parallel.ForとParallel.ForEachは、パフォーマンスが向上するのですか?もしそうなら、パフォーマンスを向上させるためにPartitionerクラスを使用して独自のパーティションを作成したい場合はどうしますか?
は タスクParallel.For Parallel.ForEachロードバランシング、ネット
が内部的に自分の負荷分散とパーティショニングを提供し、平行方法Parallel.ForとParallel.ForEachは、パフォーマンスが向上するのですか?もしそうなら、パフォーマンスを向上させるためにPartitionerクラスを使用して独自のパーティションを作成したい場合はどうしますか?
ルーチンは独自のパーティションを提供しています。
これらは「標準的な」シナリオに基づいていますが、特に異常な状況ではガイダンスが必要な場合があります。
たとえば、実装のデフォルトのパーティション化(IList<T>
を実装しない)は、タスクごとに小さなグループから開始され、サイズが徐々に大きくなります。しかし、IEnumerable<T>
が一度に1つの項目をゆっくりとフィードすることがわかっている場合は、Parallel
クラスがパーティションの要素を十分に受け取ってスケジュールするまで、次の項目を待機します。
独自のパーティショナーを提供することで、これを防ぎ、より良いスループットを得ることができます。
カスタムパーティショナーが役立つもう1つの素晴らしい例は、ループアイテムごとの作業量が非常に少ない場合です。この場合、自分でパーティションを作成してパーティションで作業することで、不必要なオーバーヘッドが回避されます。これについては、MSDNのHow to: Speed Up Small Loop Bodiesページを参照してください。