为什么此代码的PLINQ比LINQ慢?

时间:2010-04-10 23:29:47

标签: .net-4.0 parallel-processing plinq

首先,我在双核2.66Ghz处理器机器上运行它。我不确定我是否在正确的位置调用.AsParallel()。我也直接在范围变量上尝试了它,但仍然较慢。我不明白为什么......

以下是我的结果:

处理非并行1000需要146毫秒

并行处理1000耗时156毫秒

处理非并行5000需要5187毫秒

处理并行5000花了5300毫秒

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace DemoConsoleApp
{
  internal class Program
  {
    private static void Main()
    {
      ReportOnTimedProcess(
        () => GetIntegerCombinations(),
        "non-parallel 1000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(runAsParallel: true),
        "parallel 1000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(5000),
        "non-parallel 5000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(5000, true),
        "parallel 5000");

      Console.Read();
    }

    private static List<Tuple<int, int>> GetIntegerCombinations(
      int iterationCount = 1000, bool runAsParallel = false)
    {
      IEnumerable<int> range = Enumerable.Range(1, iterationCount);

      IEnumerable<Tuple<int, int>> integerCombinations =
        from x in range
        from y in range
        select new Tuple<int, int>(x, y);

      return runAsParallel
               ? integerCombinations.AsParallel().ToList()
               : integerCombinations.ToList();
    }

    private static void ReportOnTimedProcess(
      Action process, string processName)
    {
      var stopwatch = new Stopwatch();
      stopwatch.Start();
      process();
      stopwatch.Stop();

      Console.WriteLine("Process {0} took {1} milliseconds",
                        processName, stopwatch.ElapsedMilliseconds);
    }
  }
}

2 个答案:

答案 0 :(得分:4)

它稍慢,因为PLINQ有一定的开销(线程,调度等),所以你必须仔细挑选你将并行化的内容。您正在进行基准测试的这个特定代码并不值得并行化,您必须在具有显着负载的任务上进行并行化,否则开销将比并行化的好处更重要。

答案 1 :(得分:0)

这里的大部分执行时间可能是通过ToList()方法实际创建列表。这将必须执行几次内存分配,调整列表大小等等。你也没有从这里并行化获得很多好处,因为最终操作必须同步(你在输出上构建一个列表)。

尝试在并行段中执行明显更复杂/更昂贵的操作,例如素数因子分解,并将迭代次数增加到数十万(5000是在分析时使用的非常小数字) 。你应该开始看到差异。

还要确保您在发布模式下进行分析;我经常看到尝试在调试模式下进行分析,结果不准确。