为什么并行版本比本例中的顺序版本慢?

时间:2012-05-02 13:44:31

标签: c# parallel-processing

我在过去几天一直在学习关于并行性的知识,我遇到了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 PC。

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

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

2 个答案:

答案 0 :(得分:11)

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

并行编程只会在每次迭代在处理器时间方面足够昂贵时提高效率。

答案 1 :(得分:2)

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

在非并行版本的情况下就是这样。但并行版本必须调用委托。调用委托是非常快的,通常你不必担心你经常这样做。但在这种极端情况下,它才是最重要的。我可以很容易地想象,调用委托会比从数组中添加数字慢十倍(或更多,我不知道确切的比例是多少)。

相关问题