.netのPLINQ(Parallel LINQ)による並列実行の効果がどれほどなのか理解していなかったのでテストしました。
Select、Where、AverageをLINQとPLINQで実行し、速度を確認します。
var items = Enumerable.Range(1, 100_000_000).ToArray();
var sw1 = Stopwatch.StartNew();
var results1 = items.Select(x => Math.Pow(x, 0.5)).ToArray();
Debug.Print($"Select LINQ {sw1.Elapsed}");
var sw2 = Stopwatch.StartNew();
var results2 = items.AsParallel().Select(x => Math.Pow(x, 0.5)).ToArray();
Debug.Print($"Select PLINQ {sw2.Elapsed}");
var sw3 = Stopwatch.StartNew();
var results3 = items.Where(x => Math.Pow(x, 0.5) >= 100).ToArray();
Debug.Print($"Where LINQ {sw3.Elapsed}");
var sw4 = Stopwatch.StartNew();
var results4 = items.AsParallel().Where(x => Math.Pow(x, 0.5) >= 100).ToArray();
Debug.Print($"Where PLINQ {sw4.Elapsed}");
var sw5 = Stopwatch.StartNew();
var results5 = items.Average(x => Math.Pow(x, 0.5));
Debug.Print($"Average LINQ {sw5.Elapsed}");
var sw6 = Stopwatch.StartNew();
var results6 = items.AsParallel().Average(x => Math.Pow(x, 0.5));
Debug.Print($"Average PLINQ {sw6.Elapsed}");
結果
Select LINQ 00:00:04.9831283
Select PLINQ 00:00:01.1474103
Where LINQ 00:00:04.7858871
Where PLINQ 00:00:00.7447430
Average LINQ 00:00:03.8039131
Average PLINQ 00:00:00.3454058
今回のテストプログラムの場合、4倍~11倍の速度改善になっています。
.AsParallel()を追加するだけで、これだけの速度改善になるので、処理が遅くて困った場合にはまずPLINQを試すのが良さそうです。