为什么 parallel.Foreach 的时间第一次高而下一次很低?
Why time of the parallel.Foreach it is high first time and very low the next times?
我读到过,如果 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 是否值得?
Parallel Foreach 使用托管线程池,因此第一个 运行 成本可能代表线程的初始生成。
线程将留在池中并在后续 运行 中重新使用。
从统计学上讲,您可能希望生成更大的数字来衡量性能差异 - 您无法为此创建 Jefferson 定律,因为不同的工作负载或多或少会从并行化中获益。
我读到过,如果 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 是否值得?
Parallel Foreach 使用托管线程池,因此第一个 运行 成本可能代表线程的初始生成。
线程将留在池中并在后续 运行 中重新使用。
从统计学上讲,您可能希望生成更大的数字来衡量性能差异 - 您无法为此创建 Jefferson 定律,因为不同的工作负载或多或少会从并行化中获益。