ラムダ、linq、および並列で遊んでいると、1つの質問が届きます。
ラムダはlinqクエリよりも高速ですか?
O いくつかのテスト コードを記述し ( GitHub で Fork します)、ラムダ メソッドの方が高速に見えます。それは本当ですか、それとも何か不足していますか?
ラムダ、linq、および並列で遊んでいると、1つの質問が届きます。
ラムダはlinqクエリよりも高速ですか?
O いくつかのテスト コードを記述し ( GitHub で Fork します)、ラムダ メソッドの方が高速に見えます。それは本当ですか、それとも何か不足していますか?
あなたのクエリは同じではありません。
クエリ式:
from p in lista
where p.Age > 18 && p.Age < 60 && p.Phone.StartsWith("11")
select p
通常の拡張メソッド呼び出し:
.Where(n => n.Age > 18).
Where(n => n.Age < 60).
Where(n => n.Phone.StartsWith("11"))
最初のものは 1 回呼び出しWhere
ます。Where
2 番目は3 回呼び出します。それらをまったく同じように動作させるには、次を使用する必要があります。
.Where(n => n.Age > 18 && n.Age < 60 && n.Phone.StartsWith("11"))
その時点で、2 つのフォームはまったく同じコードにコンパイルされます。
さらに、テストには大きな穴があります。クエリの作成をテストしています...実際に評価していません。
sw.Start();
IEnumerable listaSemParalelismoLinq = from p in lista
where p.Age > 18 && p.Age < 60 &&
p.Phone.StartsWith("11")
select p;
sw.Stop();
クエリを実際に「実行」させるには、クエリを呼び出すなど、何らかの形式でクエリを使用する必要があります。Count()
(タイプを一般的な形式に変更する必要があります。IEnumerable
たとえば、 を使用しvar
ます。) 単純にクエリを作成するのにかかる時間は、基本的にほとんどすべての場合に関係ありません。
@Jon Skeetによって提案された変更を行い、次の順序でプログラムを実行します
Console.WriteLine("1 - LINQ without paralelism " + LinqWithoutParalelism(lista));
Console.WriteLine("2 - LINQ with paralelism " + LinqWithParalelism(lista));
Console.WriteLine("3 - Lambda without paralelism: " + LambdaWithoutParalelism(lista));
Console.WriteLine("4 - Lambda with paralelism: " + LambdaWithParalelism(lista));
どうやらランバの方が速いようですが、実行順序を次のように変更します
Console.WriteLine("3 - Lambda without paralelism: " + LambdaWithoutParalelism(lista));
Console.WriteLine("4 - Lambda with paralelism: " + LambdaWithParalelism(lista));
Console.WriteLine("1 - LINQ without paralelism " + LinqWithoutParalelism(lista));
Console.WriteLine("2 - LINQ with paralelism " + LinqWithParalelism(lista));
ラムダは速いものではありません。このテストは非常に単純で、ウォームアップ時間を考慮せず、多くの対話を行うことを考慮していませんが、実際には、私の答えは次のとおりです。いいえ、ラムダはlinqクエリよりも高速です。