【问题标题】:Why was the parallel version slower than the sequential version in this example?为什么在这个例子中并行版本比顺序版本慢?
【发布时间】:2012-05-02 13:44:31
【问题描述】:

这几天我学习了一点并行性,遇到了this这个例子。

我将它与这样的顺序 for 循环并排放置:

private static void NoParallelTest()
{
    int[] nums = Enumerable.Range(0, 1000000).ToArray();
    long total = 0;
    var watch = Stopwatch.StartNew();
    for (int i = 0; i < nums.Length; i++)
    {
        total += nums[i];
    }
    Console.WriteLine("NoParallel");
    Console.WriteLine(watch.ElapsedMilliseconds);
    Console.WriteLine("The total is {0}", total);
}

我很惊讶地看到 NoParallel 方法完成的速度比网站上给出的并行示例快得多。

我有一台 i5 电脑。

我真的认为 Parallel 方法会更快完成。

对此有合理的解释吗?也许我误解了什么?

【问题讨论】:

  • 你能确认并行版本实际上是在多核上运行的吗?当你增加迭代次数(更大的Range)会发生什么?
  • 假设并行版本确实在多个内核上运行,它可以简单地显示线程同步可能有多少开销......尤其是在一段微不足道的代码中。
  • 套用马克吐温的话; “有谎言,该死的谎言,统计数据和基准......”

标签: c# parallel-processing


【解决方案1】:

顺序版本更快,因为在您的示例中每次迭代执行操作所花费的时间非常少,并且创建和管理多个线程涉及相当大的开销。

只有在每次迭代的处理器时间足够昂贵时,并行编程才能提高效率。

【讨论】:

    【解决方案2】:

    我认为这是因为循环执行了一个非常简单、非常快速的操作。

    在非并行版本的情况下,这就是它所做的一切。但是并行版本必须调用委托。调用委托非常快,通常您不必担心这样做的频率。但在这种极端情况下,这就是与众不同的地方。我可以很容易地想象,调用委托会比从数组中添加数字慢十倍(或者更多,我不知道确切的比率是多少)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多