使用分区程序在TPL中进行分区

时间:2014-05-02 07:04:15

标签: c# .net .net-4.0 task-parallel-library parallel-extensions

我看到以下两个功能相似的代码之间存在小的性能差异,我希望有人能够帮助我理解为什么会有差异。

//Case 1 Faster
Parallel.ForEach(data, x => func(x)) 

//Case 2 Slower
Parallel.ForEach(Partitioner.Create(data), x => func(x)) 

数据类型为List< double>

据我了解,第一种情况下的默认分区也类似于Partitioner.Create(数据),因此性能应该没有区别。

有没有办法弄清楚如何在运行时完成分区?

1 个答案:

答案 0 :(得分:1)

我正在回答我自己的问题,以防有人想知道同样的事情。

我编写了一个新的MyList类,它继承自IList,并将所有方法实现为列表实例的包装器以及另外的Console.WriteLine进行调试。

有趣的是,在第一种情况下,即使我将IEnumerable实例传递给它,它似乎也会发现它是否是下面的列表并且它调用了List的索引器函数。而在第二种情况下,它调用GetEnumerator,我认为由于枚举所需的函数调用和同步,它更慢。如果我传递数据,第一种情况也会发生同样的事情。选择(x => x)而不是数据。

我想并行的实现试图找出IEnumerable是否是下面的List并且如果可以的话就使用它。