lambda比linq查询更快吗?

时间:2012-10-17 19:06:03

标签: linq c#-4.0 lambda parallel-processing parallel-extensions

我玩lambda,linq和parallel并且有一个问题到了。

lambda比linq查询更快吗?

写一些测试代码(Fork it in GitHub),lambda方法似乎更快。这是真的还是我错过了什么?

2 个答案:

答案 0 :(得分: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"))

第一个调用Where 一次;第二次调用Where三次。要使它们完全相同,您应该使用:

.Where(n => n.Age > 18 && n.Age < 60 && n.Phone.StartsWith("11"))

此时,两个表单将编译为完全相同的代码。

此外,您的测试中存在巨大的漏洞:您正在测试构建查询...您实际上从未评估它:

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。)在几乎所有情况下,简单构造查询所花费的时间基本上无关紧要。

答案 1 :(得分: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));

而且lamba更快,但我将执行顺序改为

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));

并且lambda不是更快的。 我知道这个测试很简单,我不考虑预热时间和做很多交互,但是,ACTUALY我的答案是:不,lambda不比linq查询快。