私が正しくすることができますLINQクエリで質問
(のように:コンパイラは文句はありません)このよう.AsParallel()を呼び出します。LINQクエリで.AsParallel()を呼び出すためにどこ
(from l in list.AsParallel() where <some_clause> select l).ToList();
またはこのような:まさに違いは何であるか
(from l in list where <some_clause> select l).AsParallel().ToList();
?私はほとんど常に、私はそれが進むべき道だと思ったので、使用される最初の方法を見てきましたofficial documentationから判断
を試してみた何
。
今日、私は自分自身でベンチマークをいくつか実行しようとしましたが、その結果は驚くべきものでした。
var list = new List<int>();
var rand = new Random();
for (int i = 0; i < 100000; i++)
list.Add(rand.Next());
var treshold= 1497234;
var sw = new Stopwatch();
sw.Restart();
var result = (from l in list.AsParallel() where l > treshold select l).ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() before: {sw.ElapsedMilliseconds}");
sw.Restart();
result = (from l in list where l > treshold select l).AsParallel().ToList();
sw.Stop();
Console.WriteLine($"call .AsParallel() after: {sw.ElapsedMilliseconds}");
出力
コール.AsParallel()の前に:49
コール.AsParallel()の後:4だから、
、ここで私が実行したコードです明らかに、ドキュメンテーションの記載にもかかわらず、第2の方法ははるかに高速です。ここで何が起こっているのですか?
あなたのマシンはシングルコアまたはマルチコアですか? –
@viveknunaマルチコア – Mahatma
これはいつも別の結果を与えるでしょう –