【问题标题】:Why time of the parallel.Foreach it is high first time and very low the next times?为什么是并行时间。Foreach 第一次很高,下一次很低?
【发布时间】:2023-03-05 15:08:01
【问题描述】:

我已经读过,如果 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 大约需要 29 毫秒,而 foreach 大约需要 3 毫秒。但是我第二次运行它,下一次,并行foreach需要0ms,foreach在2或3ms之间,3比2多,但结果更稳定。

所以我的疑问是,为什么第一次更慢但后来更快?我是否需要考虑这一点,如果我将多次运行命令,虽然第一次较慢,但如果下一次会更快,是否值得并行 foreach?

【问题讨论】:

标签: c# task-parallel-library parallel.foreach


【解决方案1】:

Parallel Foreach 使用托管线程池,因此首次运行成本可能代表线程的初始生成。

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

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

【讨论】:

  • 虽然您的陈述可能是正确的,但 OP 提供的两个代码并不相同。在遍历所有索引之前,并行循环可能会更快中断。
猜你喜欢
  • 2018-06-02
  • 2017-08-09
  • 2020-06-09
  • 1970-01-01
  • 2013-08-21
  • 2020-11-11
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多