【发布时间】:2012-01-12 22:41:37
【问题描述】:
执行并行方法 Parallel.For 和 Parallel.ForEach,
内部提供自己的负载平衡和分区以更好地执行?
如果是这样,您想在什么情况下使用 Partitioner 类编写自己的分区以提高性能?
【问题讨论】:
标签: .net load task partitioning parallel.foreach
执行并行方法 Parallel.For 和 Parallel.ForEach,
内部提供自己的负载平衡和分区以更好地执行?
如果是这样,您想在什么情况下使用 Partitioner 类编写自己的分区以提高性能?
【问题讨论】:
标签: .net load task partitioning parallel.foreach
例程确实提供了自己的分区。
它们基于“典型”场景,但有时可能需要指导,尤其是在不寻常的情况下。
例如,IEnumerable<T> 实现(未实现IList<T>)的默认分区将从每个任务的一个小组开始,然后慢慢增长。但是,如果您知道您的 IEnumerable<T> 将一次缓慢地喂一个项目,这将导致阻塞,因为 Parallel 类将“等待”下一个项目,直到它收到足够的元素用于分区和调度它。
通过提供您自己的分区器,您可以防止这种情况,并获得更好的吞吐量。
自定义分区器的另一个很好的例子是,如果每个循环项的工作量非常少。在这种情况下,自己分区并在分区上工作可以避免不必要的开销。这在 MSDN 上的 How to: Speed Up Small Loop Bodies 页面中有介绍。
【讨论】: