3

ラムダ、linq、および並列で遊んでいると、1つの質問が届きます。

ラムダはlinqクエリよりも高速ですか?

O いくつかのテスト コードを記述し ( GitHub で Fork します)、ラムダ メソッドの方が高速に見えます。それは本当ですか、それとも何か不足していますか?

4

2 に答える 2

8

あなたのクエリは同じではありません。

クエリ式:

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 ますWhere2 番目は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ます。) 単純にクエリを作成するのにかかる時間は、基本的にほとんどすべての場合に関係ありません。

于 2012-10-17T19:09:53.233 に答える
0

@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クエリよりも高速です。

于 2012-10-17T19:27:27.210 に答える