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