3

执行并行方法 Parallel.For 和 Parallel.ForEach,

内部提供自己的负载平衡和分区以更好地执行?

如果是这样,您想在什么情况下使用 Partitioner 类编写自己的分区以提高性能?

4

1 回答 1

4

这些例程确实提供了自己的分区。

它们基于“典型”场景,但有时可能需要指导,特别是在不寻常的情况下。

例如,IEnumerable<T>实现(未实现IList<T>)的默认分区将从每个任务的一个小组开始,然后慢慢增长。但是,如果您知道您IEnumerable<T>将一次缓慢地喂一个项目,这将导致阻塞,因为Parallel该类将“等待”下一个项目,直到它接收到足够的分区元素并对其进行调度。

通过提供您自己的分区器,您可以防止这种情况,并获得更好的吞吐量。

自定义分区器帮助的另一个很好的例子是,如果每个循环项的工作量非常少。在这种情况下,自己分区并在分区上工作可以避免不必要的开销。这在 MSDN 上的How to: Speed Up Small Loop Body页面中有介绍。

于 2012-01-12T22:50:09.640 回答