比方說,我有兩種方法:爲什麼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'也會造成一些額外的時間... –