Parallel.ForEach比常规foreach更快?

时间:2010-12-17 15:41:17

标签: .net .net-4.0 foreach parallel-processing iteration

我想知道我是否将所有常规ForEach更改为Parallel.ForEach,会加快我的所有迭代次数,还是取决于具体情况?

4 个答案:

答案 0 :(得分:3)

这取决于您的处理方式。如果它受单个CPU线程绑定并且你有多个可用的,那么是的它会更快。如果您的代码正在等待数据库,那么如果数据库支持良好的并行操作,那么产生多个副本可能会略有增加。

要考虑的最重要的事情是,如果在线程之间进行分割,您的代码是否会正常工作,或者您是否有可能导致问题的竞争条件?

答案 1 :(得分:3)

取决于具体情况。 for-each的大多数实例不执行计算上昂贵的操作或阻塞操作,因此创建任务和分配线程的开销太大而不值得。

并行性不是性能的圣杯,并非所有问题都可以并行化以提高性能。

答案 2 :(得分:1)

这一切都取决于具体情况。如果可以的话,每个并行运行将同时运行多次迭代,但有时它可以在单个处理器机器上运行。

您必须小心,但是您尝试加速的任务不应该以串行方式运行。您仍然需要担心并发条件,例如多个线程写入相同的列表等,因此使用它并不总是最好的想法。

答案 3 :(得分:1)

这绝对取决于具体情况,执行线程操作会涉及很多开销,例如:

foreach(char c in alphabet)
{
  myStr += c;
}

不会受益于并行化(以及其他问题)。在哪里像:

foreach(File f in myLargeLogFiles)
{
   LogFileProcessor p = new LogFileProcess();
   p.ProcessLogFile(f);
}

很可能从并行化中受益。它归结为环路内的工作负荷有多重;并行性带来的好处大于创建线程,线程同步等开销的好处。