C# 为什么是平行时间。对于每个人来说,第一次是高的,第二次是低的?

C# 为什么是平行时间。对于每个人来说,第一次是高的,第二次是低的?,c#,task-parallel-library,parallel.foreach,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, s

我已经读到,如果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需要0毫秒,foreach在2到3毫秒之间,是2的3倍,但是结果更稳定


所以我的疑问是,为什么第一次比较慢,但是后来比较快?如果我要多次运行一个命令,尽管第一次运行的速度较慢,但如果下一次运行的速度更快,并行foreach是否值得呢?

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

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


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

我强烈怀疑这只是常规JIT时间,因为您以非最佳方式衡量时间-。。。如果你的陈述可能是真的,但是两个由OP提供的代码是不相同的。并行循环可能会在迭代所有索引之前提前中断。