我看到以下两个功能相似的代码之间存在小的性能差异,我希望有人能够帮助我理解为什么会有差异。
//Case 1 Faster
Parallel.ForEach(data, x => func(x))
//Case 2 Slower
Parallel.ForEach(Partitioner.Create(data), x => func(x))
数据类型为List< double>
据我了解,第一种情况下的默认分区也类似于Partitioner.Create(数据),因此性能应该没有区别。
有没有办法弄清楚如何在运行时完成分区?
答案 0 :(得分:1)
我正在回答我自己的问题,以防有人想知道同样的事情。
我编写了一个新的MyList类,它继承自IList,并将所有方法实现为列表实例的包装器以及另外的Console.WriteLine进行调试。
有趣的是,在第一种情况下,即使我将IEnumerable实例传递给它,它似乎也会发现它是否是下面的列表并且它调用了List的索引器函数。而在第二种情况下,它调用GetEnumerator,我认为由于枚举所需的函数调用和同步,它更慢。如果我传递数据,第一种情况也会发生同样的事情。选择(x => x)而不是数据。
我想并行的实现试图找出IEnumerable是否是下面的List并且如果可以的话就使用它。