首先,我在双核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);
}
}
}
答案 0 :(得分:4)
它稍慢,因为PLINQ有一定的开销(线程,调度等),所以你必须仔细挑选你将并行化的内容。您正在进行基准测试的这个特定代码并不值得并行化,您必须在具有显着负载的任务上进行并行化,否则开销将比并行化的好处更重要。
答案 1 :(得分:0)
这里的大部分执行时间可能是通过ToList()
方法实际创建列表。这将必须执行几次内存分配,调整列表大小等等。你也没有从这里并行化获得很多好处,因为最终操作必须同步(你在输出上构建一个列表)。
尝试在并行段中执行明显更复杂/更昂贵的操作,例如素数因子分解,并将迭代次数增加到数十万(5000是在分析时使用的非常小数字) 。你应该开始看到差异。
还要确保您在发布模式下进行分析;我经常看到尝试在调试模式下进行分析,结果不准确。