.Net中LINQ和Lambdaexpression式的效率和性能是什么?
我已经使用.Net 3.5和VS 2008超过一个月。 和大多数.Net开发者一样,我已经从.Net 1.0&2.0和VS 2005的多年经验发展而来。最近,我发现了LINQ和Lambdaexpression式的简单性和强大性,就像我最近的问题,比如在列表中find一个项目LINQ , 使用Lambda或LINQ 将 类实例转换或映射到另一个类的实例列表 ,以及使用Lambda或LINQ 将类的列表转换或映射到另一个类的列表 。
我承认Lambda和LINQ更简单易读,而且看起来非常强大。 在幕后,.NET编译器必须生成大量代码才能实现这些function。 因此,我有点犹豫,转向新的语法,因为我已经知道“老”的方式来实现相同的结果。
我的问题是关于Lambda和LINQ的效率和性能。 也许Lambdaexpression式大多是内联函数,在这种情况下,我猜Lambda应该没问题。 那么LINQ呢?
让我们将讨论限制在LINQ到对象的LINQ到SQL(LINQ到SQL)。 任何意见,比较和经验?
没有一个答案在这里就足够了。
LINQ有很多用途和许多实现,因此对代码的效率有很多影响。
就像我们触手可及的每一项技术一样,LINQ可以也将会被滥用和误用,区分和正确使用的能力只依赖于一件事情:知识。
所以我可以给你的最好的build议是去阅读LINQ是如何实现的。
你应该检查的东西是:
- LINQ以及它如何使用现有集合types的方法和扩展方法
- LINQ如何工作
- LINQ如何在内部工作(堆栈溢出)
- 如何使用LINQ编码工作? 幕后发生了什么?
- LINQ到对象和LINQ到SQL的不同之处
- LINQ查询expression式和扩展方法有什么区别(Stack Overflow)
- 新的LINQ语法的替代方法,例如集合的.Where(…)扩展方法的用法
和往常一样,在考察效率问题时,唯一的安全方法就是测量。 使用LINQ创build一段代码,它执行一个单一的,知道的事情,并创build一个替代品,然后衡量两者,并尝试改进。 猜测和假设只会导致不好的结果。
从技术上讲,最快的方法是自己控制所有的细节。 这里是一些性能testing 。 请注意,foreach关键字和ForEach LINQ构造在编写过程代码方面的执行速度相差甚远。
但是,编译器可以并且将会得到改进,您可以始终configuration您的代码并优化任何有问题的区域。 通常build议使用更具performance力的function,使代码更容易阅读,除非您真的需要额外的纳秒。
对于LINQ查询,使用“新语法”生成的IL(代码)基本上与直接调用Enumerable和Queryable提供的扩展方法没有区别。
不要过早地优化。 如果使用Linq和新的扩展方法,可以提高可读性并在之后对应用程序进行configuration,
大多数情况下,Linq和使用plain for循环之间的区别根本不相关。 你的代码的改进的可维护性应该值几毫秒。 Linq可以慢一些,因为它可以作为状态机实现的枚举器。 所以对于(…)循环会更快。
我会build议下面的Lasse V. Karlsens的build议,并追加http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html到他的链接列表。;
LINQ查询和Lambdaexpression式之间没有性能差异。
在查看性能问题之前,您应该完全理解LINQfunction(包括Lambda,LINQ查询)如何在.Net中工作。
基本上,你可以使用任何一个LINQ查询和Lambdaexpression式。
LINQ查询
-
它是高度可读的查询。
-
它被转换成equalent Lambdaexpression式和作为节点添加到expression式树中的Lambdaexpression式。 使lambdaexpression式的结构的expression树。 这是由编译器完成的。
-
查询提供程序查找expression式(作为expression式树中的节点添加),并生成相等的SQL查询运算符,从而在运行时形成相等的sql查询。
-
返回types:结果集(IEnumerable)。
Lambdaexpression式
-
它是一组expression式/语句并创build委托/expression式树。 它可以作为parameter passing给一个函数。
-
它支持所有的LINQ方法,如LINQ查询。 (其中,select,计数,总和,等等)
-
形成了一个expression式结构的lambdaexpression式。 这是由编译器完成的。
-
查询提供程序查看expression式(expression式树),并在运行时生成相等的SQL查询。
-
返回types:Delagate /expression式树
哪个最好?
你可以理解LINQ(查询,Lambda)如果你看看上面的几点。
LINQ查询的好处 – 它是可读的。
Lambda的优势
-
Lambda将会有一个优点,因为它创build了一个委托,通过使用这个委托,您可以传递input参数,并获得不同input参数的结果。您也不需要针对不同的标准编写不同的查询。
-
您可以使用Lambdaexpression式和expression式树来创builddynamic查询。
-
如果要将语句的结果作为parameter passing给方法,则可以使用Lambdaexpression式。
-
表情更短。
所以Lambdaexpression式是LINQ查询开发的最佳select。
在某些情况下,LINQ的速度如果不比其他方法快,但在其他情况下,速度可能会变慢。 我们在一个转换为linq的项目上工作,数据查找速度更快,但两个表之间的数据合并要慢得多。 有一点点的开销,但是在大多数情况下我看不到速度差异对你的程序有很大的影响。