首页 文章

在.Net中LINQ和Lambda表达的效率和性能是什么?

提问于
浏览
34

我使用.Net 3.5和VS 2008一个多月了 . 像大多数.Net开发人员一样,我已经从.Net 1.0&2.0和VS 2005的多年经验发展而来 . 就在最近,我发现了LINQ和Lambda表达式的简单性和强大功能,就像我最近的问题,如Find an item in list by LINQConvert or map a class instance to a list of another one by using Lambda or LINQConvert or map a list of class to another list of class by using Lambda or LINQ .

我承认Lambda和LINQ更简单易读,看起来非常强大 . 在幕后,.Net编译器必须生成大量代码才能实现这些功能 . 因此,我对转换到新语法有点犹豫,因为我已经知道了实现相同结果的“旧”方法 .

我的问题是关于Lambda和LINQ的效率和性能 . 也许Lambda表达式大多是内联函数,在这种情况下我猜Lambda应该没问题 . LINQ怎么样?

让我们将讨论限制为LINQ-to-Objects LINQ-to-SQL(LINQ-to-SQL) . 任何评论,比较和经验?

6 回答

  • 32

    这里没有一个单一的答案就足够了 .

    LINQ有许多用途和许多实现,因此对代码的效率有很多影响 .

    正如触手可及的每一项技术一样,LINQ可以并且将被滥用和滥用,并且区分它和正确使用的能力仅取决于一件事:知识 .

    所以我能给你的最好的建议是去了解LINQ是如何真正实现的 .

    你应该检查的事情是:

    和往常一样,在查看效率问题时,唯一安全的方法就是衡量 . 使用LINQ创建一段代码,它执行单个,知道,创建替代方案,然后测量两者,并尝试改进 . 猜测和假设只会导致糟糕的结果 .

  • 5

    从技术上讲,最快的方法是自己控制所有细节 . Here are some performance tests . 请注意,foreach关键字和ForEach LINQ构造的使用速度远比仅使用和编写过程代码要慢得多 .

    但是,编译器可以并且将会得到改进,您可以随时分析代码并优化任何有问题的区域 . 通常建议使用更具表现力的功能,使代码更容易阅读,除非你真的需要额外的纳秒 .

  • 3

    对于LINQ查询,使用“新语法”,生成的IL(代码)基本上与直接调用Enumerable和Queryable提供的扩展方法没有什么不同 .

  • 6

    不要过早优化 . 如果Linq和新的扩展方法提高了可读性并在之后对应用程序进行了分析,请大量使用它们 .

    大多数情况下,Linq和使用plain for循环之间的差异根本不相关 . 代码的可维护性提高应该值几毫秒 . Linq可能会更慢,因为它适用于作为状态机实现的枚举器 . 因此(...)循环的简单性会更快 .

    我建议按照Lasse V. Karlsens的建议,将http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html追加到他的链接列表中 .

  • 2

    在某些情况下,LINQ的速度与其他方法一样快,但在其他情况下,它可能会更慢 . 我们处理一个项目,我们转换为linq,数据查找速度更快,但两个表之间的数据合并要慢得多 . 有一点开销,但在大多数情况下,我没有看到速度差异对您的程序有太大影响 .

  • 2

    LINQ查询和Lambda表达式之间没有性能差异 .

    在研究性能问题之前,您应该完全理解LINQ功能(Lambda,LINQ查询)如何在.Net中工作 .

    基本上,您可以使用LINQ查询和Lambda表达式中的任何一个 .

    LINQ Queries

    • 这是高级可读查询 .

    • 将其转换为等价的Lambda表达式,并将Lambda表达式作为节点添加到表达式树中 . 表达树,它构成lambda表达式的结构 . 这是由编译器完成的 .

    • 查询提供程序查看表达式(在表达式树中添加为节点)并生成等价的SQL查询运算符,从而在运行时形成等价的sql查询 .

    • 返回类型:结果集(IEnumerable) .

    Lambda Expressions

    • 它是一组表达式/语句,用于创建委托/表达式树 . 它可以作为参数传递给函数 .

    • 它支持所有LINQ方法,如LINQ查询 . (其中,选择,计数,总和,等等)

    • 形成了一个表达式树,它构成了lambda表达式的结构 . 这是由编译器完成的 .

    • 查询提供程序查看表达式(表达式树)并在运行时生成等价的SQL查询 .

    • 返回类型:Delagate / Expression Tree

    Which is Best?

    你可以理解LINQ(Queries,Lambda)如果你看一下上面的几点 .

    LINQ查询的优点 - 可读 .

    Lambda的优势

    • Lambda将具有优势,因为它创建了一个委托,并且通过使用delagte,您只需传递输入参数并获得不同输入参数的结果 . 您也不需要为不同的标准编写不同的查询 .

    • 您可以使用Lambda表达式和表达式树创建动态查询 .

    • 如果要将语句结果作为参数传递给方法,则可以使用Lambda表达式 .

    • 表达式更短 .

    因此,Lambda表达式对于LINQ查询的开发是最佳的 .

相关问题