だが、私はこれらの2つの方法があるとしましょう:PLINQがforループよりも遅いのはなぜですか?
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が原因のスレッドの設定のいくつかのオーバーヘッドがありますが、このような大きなであることを理解しますn
私はPLINQがより速くなることを期待していました。ここで
は別の結果である:
PFactorial(50000) -> 4,91035 seconds
Factorial(50000) -> 4,40056 seconds
(最小4は、あなたに良い分析を与える)あなたは、マルチコアプロセッサを使用していることを確認し、これは、なぜ我々のベンチマークです。何かを並列化することによってどれだけ多くのものが得られたかを推測するのではなく、テストする必要があります。もちろん、集計は並列化できますが、他のタイプの操作(投影など)ほど効果的ではありません。 – Servy
'集約 'は並行して起こりません。 – Ryan
'Enumerable.Range'はいくつかの追加時間も発生させます... –