What is the Efficiency and Performance of LINQ and Lambda Expression in .Net?
我已经用了.NET 3.5和vs 2008一个多月了。和大多数.NET开发人员一样,我也从.NET 1.0&2.0和2005年的经验中发展而来。就在最近,我发现了linq和lambda表达式的简单性和强大性,就像在我最近的问题中一样,比如按linq在list中查找一个项,使用lambda或linq将一个类实例转换或映射到另一个实例的列表,以及使用lambda或linq将一个类列表转换或映射到另一个类列表。
我承认lambda和linq非常简单易读,它们看起来非常强大。在幕后,.NET编译器必须生成许多代码来实现这些功能。因此,我有点犹豫是否切换到新的语法,因为我已经知道了实现相同结果的"旧"方法。
我的问题是关于lambda和linq的效率和性能。也许lambda表达式主要是内联函数,在这种情况下,我想lambda应该可以。林Q怎么样?
让我们将讨论限制为linq to objects linq to sql(linq to sql)。有什么评论、比较和经验吗?
这里没有一个答案可以满足。
Linq有许多用途和实现,因此对代码的效率有许多影响。
就像我们指尖上的每一项技术一样,Linq可以也将被滥用和误用,区分这一点和正确使用的能力只取决于一件事:知识。
所以我能给你的最好建议是去读一下Linq是如何真正实现的。
您应该检查的内容包括:
- Linq及其如何对现有集合类型使用方法和扩展方法
- 林Q如何工作
- LINQ如何在内部工作(堆栈溢出)
- 用LINQ编码是如何工作的?幕后发生了什么?
- Linq to对象和Linq to SQL的区别
- LINQ查询表达式和扩展方法(堆栈溢出)有什么区别?
- 新LINQ语法的替代方法,例如,集合的.where(…)扩展方法的用法
和往常一样,在研究效率问题时,唯一安全的方法就是测量。使用LINQ创建一段代码,它执行单个、知道、事情,并创建一个替代项,然后测量两者,并尝试改进。猜测和假设只会导致糟糕的结果。
技术上来说,最快的方法是自己控制所有的细节。下面是一些性能测试。注意,foreach关键字和foreach linq构造的速度要比只用于和编写过程代码慢得多。
但是,编译器可以并且将得到改进,并且您可以随时分析代码并优化任何有问题的区域。通常建议使用更具表现力的特性,使代码更容易阅读,除非您确实需要额外的纳秒。
对于LINQ查询,使用"新语法"生成的IL(代码)与直接调用Enumerable和Queryable提供的扩展方法没有根本区别。
不要过早优化。如果LINQ和新的扩展方法提高了可读性,并在以后对应用程序进行概要分析,那么可以大量使用它们。
大多数时候,linq和使用plain for循环之间的差异根本不相关。改进后的代码可维护性应该值得花上几毫秒。LINQ可以变慢,因为它在作为状态机实现的枚举器上工作。所以(…)循环的普通格式将更快。
我建议遵循lase v.karlsens的建议,并将http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html添加到他的链接列表中。
LINQ查询和lambda表达式之间没有性能差异。
在研究性能问题之前,您应该完全了解linq特性(lambda和linq查询)在.NET中的工作原理。
基本上,您可以同时使用Linq查询和lambda表达式中的任何一个。
LINQ查询
它是一个高级可读查询。
它被转换成相等的lambda表达式和lambda表达式作为节点添加到表达式树中。表达式树它构成lambda表达式的结构。这是由编译器完成。
查询提供程序查找表达式(作为表达式树中的节点添加)和生成相等的SQL查询运算符,从而在运行时。
返回类型:结果集(IEnumerable)。
表达式
它是一组表达式/语句并创建委托/表达式树。它可以作为争论。
它支持所有的LINQ方法,比如LINQ查询。(其中,select、count、sum等)
形成的表达式树生成lambda结构表达。这是通过编译程序。
查询提供程序查找表达式(表达式树)和在运行时。
返回类型:Delagate/表达式树
哪一个最好?
如果您研究以上几点,就可以理解LINQ(查询,lambda)。
LINQ查询的优点-它是可读的。
lambda的优势
lambda将具有一个优势,因为它创建委托并使用你只需通过输入参数并得到结果对于不同的输入参数。不需要写入不同的查询标准也是如此。
您可以通过以下方式创建动态查询:使用lambda表达式和表达式树。
如果你想通过的结果对方法的语句争论。
表达式较短。
因此lambda表达式最适合于通过LINQ查询进行开发。
在某些情况下,如果Linq的速度不比其他方法快的话,它也一样快,但在其他情况下,它可能会慢一些。我们在一个转换为LINQ的项目中工作,数据查找速度更快,但两个表之间的数据合并速度要慢得多。有一点开销,但在大多数情况下,我看不到速度差对你的程序有多大影响。