比方说,我有两种方法:为什么PLINQ比循环慢?
public BigInteger PFactorial(int n)
{
return Enumerable.Range(1, n)
.AsParallel()
.Select(i => (BigInteger)i)
.Aggregate(BigInteger.One, BigInteger.Multiply);
}
public BigInteger Factorial(int n)
{
BigInteger result = BigInteger.One;
for(int i = 1; i <= n; i++)
result *= i;
return result;
}
下面是结果我:
PFactorial(25000) -> 0,9897 seconds
Factorial(25000) -> 0,9252 seconds
据我所知,PLINQ有,因为线程设置的一些开销,但这么大的我期待PLINQ更快。
这里是另外一个结果是:
PFactorial(50000) -> 4,91035 seconds
Factorial(50000) -> 4,40056 seconds
这就是为什么我们的标杆。不要猜测并行化某件事会获得多少收益,而应该测试一下,所以你肯定知道。当然,请记住,聚合可以并行,但并不像其他类型的操作(如预测)那样有效。 – Servy
'Aggregate'不会并行发生。 – Ryan
'Enumerable.Range'也会造成一些额外的时间... –