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

我在过去几天一直在学习关于并行性的知识,我遇到了这个例子。

我把它与顺序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方法会更快完成。

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

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

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

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

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

你不是把苹果和橘子比较。

您链接到的示例不是关于并行性或并发性,而是关于断开状态与不同线程之间的共享 。 它正在做的工作是一个稻草人,只是表明正在做的事情。

所以你要比较的是将F1赛车与Top Fuel Dragster比较。 每个人都快速前进,但速度 ,相对于在这个和大多数情况下高度专业化的环境。 两者都不能在其他高度专业化的bailiwick竞争。

要学习的经验教训

  • 并发!=更快
  • 设想不佳的基准误导了