2017-10-19 42 views
-1

我读过,如果foreach非常简单,我得到的使用并行foreach的开销不值得。所以我有一个简单的WPF应用程序来做一些测试。我有这个代码:平行的时间为什么?下一次这是第一次很高,很低?

//Parallel.Foreach 
txtLog.Text = txtLog.Text + "\r\n\r\n\r\nSe inicia el Parallel.Foreach a " + DateTime.Now; 
miSw.Restart(); 
Parallel.ForEach(miLstInt, 
    (iteradorInt, state) => 
    { 
     if (iteradorInt >= 500000) 
     { 
      state.Stop(); 
     } 
    }); 
miSw.Stop(); 

txtLog.Text = txtLog.Text + "\r\nTiempo total del Parallel.Foreach: " + miSw.ElapsedMilliseconds.ToString(); 



//Forech 
txtLog.Text = txtLog.Text + "\r\n\r\nSe inicia el foreach a " + DateTime.Now; 
miSw.Restart(); 
foreach (int i in miLstInt) 
{ 
    if (i >= 500000) 
    { 
     break; 
    } 
} 
miSw.Stop(); 
txtLog.Text = txtLog.Text + "\r\nTiempo total del foreach: " + miSw.ElapsedMilliseconds.ToString(); 

我有一个按钮,当我点击它时,它运行两个foreach并在文本框中显示结果。

当我第一次运行时,平行foreach大约需要29ms,而且每个约3ms。但是第二次运行它和下一次,平行foreach需要0ms,foreach在2或3ms之间,比3多2次,但结果更稳定。

所以我的疑问是,为什么它第一次更慢,但后来更快?我是否应该考虑这一点,如果我将多次运行命令,尽管第一次运行速度较慢,如果下一次运行速度更快,是否值得平行使用?

+2

我强烈怀疑这只是正常的JIT时间,因为你测量的时间不是最优方式 - https://stackoverflow.com/questions/457605/how-to-measure-code-performance-in-net ...如果同意,请考虑关闭重复。 –

回答

1

并行Foreach使用托管线程池,以便首次运行成本可能表示线程的初始产卵。

线程将留在池中,并在随后的运行中重新使用。

统计学上,您可能希望生成更大的数字来衡量性能差异 - 并且您无法为此创建Jefferson定律,因为不同的工作负载会从并行化中获益或多或少。

+2

尽管您的陈述也许是正确的,但OP提供的两个代码并不完全相同。在迭代所有索引之前,并行循环可能会更快地中断。 –

相关问题