【问题标题】:Are lambda faster than linq queries?lambda 比 linq 查询快吗?
【发布时间】:2012-10-17 19:06:02
【问题描述】:

我正在玩 lambda、linq 和 parallel,一个问题来了。

lambda 比 linq 查询快吗?

O 编写一些测试代码 (Fork it in GitHub) 并且 lambda 方法似乎更快。这是真的还是我遗漏了什么?

【问题讨论】:

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


    【解决方案1】:

    您的查询不一样。

    查询表达式:

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

    【讨论】:

    • 对,我错过了这一点。更改代码以再次测试。
    【解决方案2】:

    我做了@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 并不是更快的。 我知道这个测试非常简单,我没有考虑预热时间并进行大量交互,但是,实际上我的答案是:不,lambda 并不比 linq 查询快。

    【讨论】:

    • 不,正如我之前所说:这两种形式将编译成完全相同的代码。查询表达式被编译器有效地转换为“没有查询表达式的 C#”。
    • 不要在同一个执行行中运行多个测试,可能会发生很多事情... GC 可能会妨碍等等... 一次只运行 1 个测试并运行几次以获得值得信赖的价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多