任务Parallel.For Parallel.ForEach负载平衡,partiioning .Net

时间:2012-01-12 22:41:37

标签: .net load task partitioning parallel.foreach

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

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

如果是这样,你想在什么情况下使用Partitioner类创建自己的分区来提高性能?

1 个答案:

答案 0 :(得分:4)

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

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

例如,IEnumerable<T>实现(未实现IList<T>)的默认分区将从每个任务的一个小组开始,并且会逐渐增大。但是,如果你知道你的IEnumerable<T>将一次慢慢地提供一个项目,这将导致一个阻止,因为Parallel类将“等待”下一个项目,直到它收到足够的元素为止分区并安排它。

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

自定义分区程序帮助的另一个很好的例子是每个循环项目的工作量非常少。在这种情况下,对自己进行分区并处理分区可以避免不必要的开销。这已在MSDN上的How to: Speed Up Small Loop Bodies页面中介绍。