我使用.Net 3.5和VS 2008一个多月了。像大多数.Net开发人员一样,我已经从.Net 1.0&amp ;;的多年经验中发展而来。 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)。任何评论,比较和经验?
答案 0 :(得分:32)
这里没有一个单一的答案就足够了。
LINQ有许多用途和许多实现,因此对代码的效率有很多影响。
正如触手可及的每一项技术一样,LINQ可以并且将会被滥用和滥用,并且区分它和正确使用的能力仅取决于一件事:知识。
所以我能给你的最好的建议是去了解LINQ是如何真正实现的。
您应该检查的事项是:
与往常一样,在查看效率问题时,唯一安全的方法就是衡量。使用LINQ创建一段代码,它执行单个,知道,创建替代方案,然后测量两者,并尝试改进。猜测和假设只会导致糟糕的结果。
答案 1 :(得分:6)
从技术上讲,最快的方法是自己控制所有细节。 Here are some performance tests。请注意,foreach关键字和ForEach LINQ构造的使用速度远比仅使用和编写过程代码慢得多。
但是,编译器可以并且将会得到改进,您可以随时分析代码并优化任何有问题的区域。通常建议使用更具表现力的功能,使代码更容易阅读,除非你真的需要额外的纳秒。
答案 2 :(得分:5)
对于LINQ查询,使用“新语法”,生成的IL(代码)基本上与直接调用Enumerable和Queryable提供的扩展方法没有什么不同。
答案 3 :(得分:3)
不要过早优化。如果Linq和新的扩展方法提高了可读性并在之后对应用程序进行了分析,那么请大量使用它们。
大多数情况下,Linq和使用plain for循环之间的差异根本不相关。代码的可维护性提高应该值几毫秒。 Linq可能会更慢,因为它适用于作为状态机实现的枚举器。因此(...)循环的简单性会更快。
我建议按照Lasse V. Karlsens的建议,将http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html附加到他的链接列表中。
答案 4 :(得分:2)
在某些情况下,LINQ的速度与其他方法一样快,但在其他情况下,它可能会更慢。我们处理一个项目,我们转换为linq,数据查找速度更快,但两个表之间的数据合并要慢得多。有一点开销,但在大多数情况下,我没有看到速度差异对您的程序有太大影响。
答案 5 :(得分:2)
LINQ查询和Lambda表达式之间没有性能差异。
在调查性能问题之前,您应该完全理解LINQ功能(Lambda,LINQ查询)如何在.Net中运行。
基本上,您可以使用LINQ查询和Lambda表达式中的任何一个。
LINQ查询
这是高级可读查询。
将其转换为等价的Lambda 表达式和Lambda表达式作为节点添加到表达式树中。表达式树 这使得lambda表达式的结构。这是 由编译器完成。
查询提供商查看 表达式(作为表达式树中的节点添加)和 生成等价的SQL查询运算符,从而在此期间形成了sql查询 运行。
返回类型:结果集(IEnumerable)。
Lambda表达式
这是一组表达式/语句并创建委托/ 表达树。它可以 被传递给一个函数 参数。
它支持所有LINQ方法,如LINQ查询。 (式中,选择,计数,点心,等)
形成一个表达式树 制作lambda的结构 表达式。这是通过 编译器。
查询提供商查看 表达式(表达式树)和 在期间生成等价的SQL查询 运行时。
返回类型:Delagate / 表达树
哪个最好?
你可以理解LINQ(查询,Lambda)如果你看一下上面的几点。
LINQ查询的优点 - 可读。
Lambda的优势
Lambda将有一个优势,因为它创建一个委托并使用 你可以通过的delagte 输入参数并得到结果 对于不同的输入 参数。你不需要写 针对不同的不同查询 标准也是如此。
您可以创建动态查询 使用Lambda表达式和 表达树。
如果是,您可以使用Lambda表达式 你想传递结果 作为一种方法的声明 参数。
表达式更短。
因此,Lambda表达式最适合用于LINQ查询的开发。