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

Dav*_*.ca 38 .net c# linq lambda .net-3.5

我使用.Net 3.5和VS 2008一个多月了.像大多数.Net开发人员一样,我已经从.Net 1.0&2.0和VS 2005的多年经验发展而来.就在最近,我发现了LINQ和Lambda表达式的简单性和强大功能,就像我最近的问题一样,例如在列表中查找项目LINQ,使用Lambda或LINQ 类实例转换或映射到另一个实例的列表,并使用Lambda或LINQ 将类列表转换或映射到另一个类列表.

我承认Lambda和LINQ更简单易读,看起来非常强大.在幕后,.Net编译器必须生成大量代码才能实现这些功能.因此,我对转换到新语法有点犹豫,因为我已经知道了实现相同结果的"旧"方法.

我的问题是关于Lambda和LINQ的效率和性能.也许Lambda表达式大多是内联函数,在这种情况下我猜Lambda应该没问题.LINQ怎么样?

让我们将讨论限制为LINQ-to-Objects LINQ-to-SQL(LINQ-to-SQL).任何评论,比较和经验?

ang*_*son 33

这里没有一个单一的答案就足够了.

LINQ有许多用途和许多实现,因此对代码的效率有很多影响.

正如触手可及的每一项技术一样,LINQ可以并且将被滥用和滥用,并且区分它和正确使用的能力仅取决于一件事:知识.

所以我能给你的最好的建议是去了解LINQ是如何真正实现的.

你应该检查的事情是:

和往常一样,在查看效率问题时,唯一安全的方法就是衡量.使用LINQ创建一段代码,它执行单个,知道,创建替代方案,然后测量两者,并尝试改进.猜测和假设只会导致糟糕的结果.


Geo*_*uer 6

从技术上讲,最快的方法是自己控制所有细节. 以下是一些性能测试.请注意,foreach关键字和ForEach LINQ构造的使用速度远比仅使用和编写过程代码要慢得多.

但是,编译器可以并且将会得到改进,您可以随时分析代码并优化任何有问题的区域.通常建议使用更具表现力的功能,使代码更容易阅读,除非你真的需要额外的纳秒.

  • 那个例子真的不是一个好的考验.首先,他将单个反向迭代+删除与双重迭代+列表创建+删除进行比较.其次,为什么删除你可以改为*选择你想要的值*?使用LINQ的这种方法甚至比反向删除更快.第三,他没有考虑JIT,运行我的测试两次显示第二次,LINQ方法(令人惊讶的是)足够快100倍.我的发现:http://img188.imageshack.us/img188/4408/linq.png其中"Silly LINQ"是他的双重迭代+创建+删除方法. (3认同)
  • 没有考虑到jitting的成本是一个非常普遍的错误,那些没有太多编写实际基准测试经验的人.情景越接近"现实",结果就越好; 仅对第一次调用方法进行基准测试是非常不现实的.实际上,大多数性能问题是数百万次呼叫的结果,其中只有一次是第一次! (3认同)

小智 5

对于LINQ查询,使用"新语法",生成的IL(代码)基本上与直接调用Enumerable和Queryable提供的扩展方法没有什么不同.