我正在玩 lambda、linq 和 parallel,一个问题来了。
lambda 比 linq 查询快吗?
O 编写一些测试代码(在 GitHub 中 Fork it)并且 lambda 方法似乎更快。这是真的还是我错过了什么?
我正在玩 lambda、linq 和 parallel,一个问题来了。
lambda 比 linq 查询快吗?
O 编写一些测试代码(在 GitHub 中 Fork it)并且 lambda 方法似乎更快。这是真的还是我错过了什么?
您的查询不一样。
查询表达式:
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
。)在几乎所有情况下,简单地构造查询所花费的时间基本上是无关紧要的。
我做了@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));
并且 lambda 不是更快的。我知道这个测试非常简单,我没有考虑预热时间并进行大量交互,但是,实际上我的回答是:不,lambda 并不比 linq 查询快。