查询表达式与Lambda表达式

时间:2013-06-24 04:37:16

标签: c# performance linq lambda query-expressions

使用查询表达式而不是lambda表达式有什么意义?它不仅更慢,更冗长(see here)

示例(来自上面的链接):

QE: var products = from p in northwind.Products where p.Category.CategoryName == "Beverages" select p;
LE: var products = northwind.Products.Where(p => p.Category.CategoryName == "Beverages");

结果(来自上面的链接):

QE: 00:00:00.0019557, avg. 00:00:00.0004552
LE: 00:00:00.0000574, avg. 00:00:00.0000133

为了便于阅读,是否真的值得将代码放慢34倍?

2 个答案:

答案 0 :(得分:10)

最后它们是相同的。

您的文章测试速度异常快的原因是延迟执行。该代码实际上并没有在他们正在计时的区域做任何事情。它只会在调用.ToList()时执行某些操作或强制查询(lambda或其他)的其他方法。它可以快速解释查询(非常快速,查看您提供的时间),但是当查询得到评估时,它实际上是循环数据的另一个野兽。

编辑:

我刚读过这篇文章。您会注意到,根据作者的说法,for循环是所有3循环中最慢的(查询表达式,方法语法,for循环)。这是非常错误的。

基本for循环如何比lambda慢几千倍?这没有意义。循环是迭代数据的最基本方式。 lambda做的比循环更令人难以置信的是什么呢?

......他们没有。他们还没有执行。看哪:推迟执行。

答案 1 :(得分:1)

编译器将查询表达式转换为使用lambdas的查询。这意味着两个样本将编译为完全相同的代码,因此没有性能差异。

这意味着您链接到的基准是非常错误的(考虑到它所做的其他错误,这并不是很令人惊讶),您应该根据可读性来决定这两种形式。