我写了一个小程序来检查Sum()
枚举AsParallel()
的性能(即PLINQ)。
首先,我生成一个IEnumerable
。范围不是特别大,因为LINQ Sum()
would result in an overflow。
IEnumerable<int> range = Enumerable.Range(1, 30000);
我的第一个基准测试是使用常规循环执行的:
var stopwatch = new Stopwatch();
stopwatch.Start();
int total = 0;
foreach(int x in range)
{
total += x;
}
stopwatch.Stop();
Console.WriteLine("Sum 1: {0}; time: {1}", total, stopwatch.Elapsed);
我的第二个基准使用LINQ Sum()
:
stopwatch.Restart();
int total2 = range.Sum();
stopwatch.Stop();
Console.WriteLine("Sum 2: {0}; time: {1}", total2, stopwatch.Elapsed);
我的第三个基准使用了PLINQ Sum()
:
stopwatch.Restart();
int total3 = range.AsParallel().Sum();
stopwatch.Stop();
Console.WriteLine("Sum 3: {0}; time: {1}", total3, stopwatch.Elapsed);
以下是一些结果:
Sum 1: 450015000; time: 00:00:00.0004210
Sum 2: 450015000; time: 00:00:00.0003545
Sum 3: 450015000; time: 00:00:00.0427375
为什么PLINQ版本(Sum 3)比其他版本慢得多?另外,为什么LINQ Sum()
(Sum 2)比普通循环(Sum 1)更快?