为什么是parallel.Foreach的时间是第一次很高而下次很低?

时间:2017-10-19 17:26:53

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

我已经读过,如果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并在textBox中显示结果。

当我第一次跑步的时候,平行的foreach需要大约29ms并且预计大约3ms。但是第二次运行它和下一次,并行foreach需要0ms,foreach在2或3ms之间,比3次更多,但结果更稳定。

所以我的疑问是,为什么第一次更慢,但后来更快?我是否应该考虑这个问题,如果我会多次运行一个命令,虽然第一次运行速度较慢,如果下一次运行速度更快,是否值得并行使用?

1 个答案:

答案 0 :(得分:1)

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

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

从统计数据来看,您可能希望生成更大的数字来衡量性能差异 - 而且您无法为此创建Jefferson法则,因为不同的工作负载或多或少地受益于并行化。