3

並列メソッド Parallel.For および Parallel.ForEach を実行します。

内部で独自のロード バランシングとパーティショニングを提供してパフォーマンスを向上させていますか?

もしそうなら、どのような状況で、Partitioner クラスを使用して独自のパーティションを作成してパフォーマンスを向上させたいですか?

4

1 に答える 1

4

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

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

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

独自のパーティショナーを提供することで、これを防ぎ、スループットを向上させることができます。

カスタムパーティショナーが役立つもう1つの優れた例は、ループアイテムごとの作業量が非常に少ない場合です。この場合、自分でパーティションを作成してパーティションで作業することで、不要なオーバーヘッドを回避できます。これについては、MSDNの「 Howto:Speed UpSmallLoopBodies」ページで説明されています。

于 2012-01-12T22:50:09.640 に答える