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

时间:2009-07-25 20:05:38

标签: c# .net linq .net-3.5 lambda

我使用.Net 3.5和VS 2008一个多月了。像大多数.Net开发人员一样,我已经从.Net 1.0&amp ;;的多年经验中发展而来。 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 个答案:

答案 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查询

  1. 这是高级可读查询。

  2. 将其转换为等价的Lambda 表达式和Lambda表达式作为节点添加到表达式树中。表达式树 这使得lambda表达式的结构。这是 由编译器完成。

  3. 查询提供商查看 表达式(作为表达式树中的节点添加)和 生成等价的SQL查询运算符,从而在此期间形成了sql查询 运行。

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

  5. Lambda表达式

    1. 这是一组表达式/语句并创建委托/ 表达树。它可以 被传递给一个函数 参数。

    2. 它支持所有LINQ方法,如LINQ查询。 (式中,选择,计数,点心,等)

    3. 形成一个表达式树 制作lambda的结构 表达式。这是通过 编译器。

    4. 查询提供商查看 表达式(表达式树)和 在期间生成等价的SQL查询 运行时。

    5. 返回类型:Delagate / 表达树

    6. 哪个最好?

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

      LINQ查询的优点 - 可读。

      Lambda的优势

      1. Lambda将有一个优势,因为它创建一个委托并使用 你可以通过的delagte 输入参数并得到结果 对于不同的输入 参数。你不需要写 针对不同的不同查询 标准也是如此。

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

      3. 如果是,您可以使用Lambda表达式 你想传递结果 作为一种方法的声明 参数。

      4. 表达式更短。

      5. 因此,Lambda表达式最适合用于LINQ查询的开发。