PLINQ 出力が順次処理や Parallel.For ループと異なる理由
10,000,000 個の数値の平方根の合計を追加したい.. 3 つのケースのコードは次のとおりです。
シーケンシャル for ループ:
double sum = 0.0;
for(int i = 1;i<10000001;i++)
sum += Math.Sqrt(i);
これの出力は次のとおりです: 21081852648.717
Parallel.For ループを使用するようになりました:
object locker = new object();
double total ;
Parallel.For(1,10000001,
()=>0.0,
(i,state,local)=> local+Math.Sqrt(i),
(local)=>
{
lock(locker){ total += local; }
}
);
これの出力は次のとおりです: 21081852648.7199
PLINQ を使用中
double tot = ParallelEnumerable.Range(1, 10000000)
.Sum(i => Math.Sqrt(i));
これの出力は次のとおりです: 21081852648.72
PLINQ 出力と Parallel.For および Sequential for ループに違いがあるのはなぜですか?