我使用.Net 3.5和VS 2008一个多月了 . 像大多数.Net开发人员一样,我已经从.Net 1.0&2.0和VS 2005的多年经验发展而来 . 就在最近,我发现了LINQ和Lambda表达式的简单性和强大功能,就像我最近的问题,如Find an item in list by LINQ,Convert or map a class instance to a list of another one by using Lambda or LINQ和Convert 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 回答
这里没有一个单一的答案就足够了 .
LINQ有许多用途和许多实现,因此对代码的效率有很多影响 .
正如触手可及的每一项技术一样,LINQ可以并且将被滥用和滥用,并且区分它和正确使用的能力仅取决于一件事:知识 .
所以我能给你的最好的建议是去了解LINQ是如何真正实现的 .
你应该检查的事情是:
LINQ以及它如何在现有集合类型上使用方法和扩展方法
How LINQ Works
How LINQ works internally (Stack Overflow)
How does coding with LINQ work? What happens behind the scenes?
LINQ到对象和LINQ到SQL的区别
What is the difference between LINQ query expressions and extension methods (Stack Overflow)
新LINQ语法的替代方案,例如,集合的.Where(...)扩展方法的使用
和往常一样,在查看效率问题时,唯一安全的方法就是衡量 . 使用LINQ创建一段代码,它执行单个,知道,创建替代方案,然后测量两者,并尝试改进 . 猜测和假设只会导致糟糕的结果 .
从技术上讲,最快的方法是自己控制所有细节 . Here are some performance tests . 请注意,foreach关键字和ForEach LINQ构造的使用速度远比仅使用和编写过程代码要慢得多 .
但是,编译器可以并且将会得到改进,您可以随时分析代码并优化任何有问题的区域 . 通常建议使用更具表现力的功能,使代码更容易阅读,除非你真的需要额外的纳秒 .
对于LINQ查询,使用“新语法”,生成的IL(代码)基本上与直接调用Enumerable和Queryable提供的扩展方法没有什么不同 .
不要过早优化 . 如果Linq和新的扩展方法提高了可读性并在之后对应用程序进行了分析,请大量使用它们 .
大多数情况下,Linq和使用plain for循环之间的差异根本不相关 . 代码的可维护性提高应该值几毫秒 . Linq可能会更慢,因为它适用于作为状态机实现的枚举器 . 因此(...)循环的简单性会更快 .
我建议按照Lasse V. Karlsens的建议,将http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html追加到他的链接列表中 .
在某些情况下,LINQ的速度与其他方法一样快,但在其他情况下,它可能会更慢 . 我们处理一个项目,我们转换为linq,数据查找速度更快,但两个表之间的数据合并要慢得多 . 有一点开销,但在大多数情况下,我没有看到速度差异对您的程序有太大影响 .
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查询的开发是最佳的 .