3

使用查询表达式而不是 lambda 表达式有什么意义?它不仅更慢而且更冗长(见这里)

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

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 倍的代码真的值得吗?

4

2 回答 2

10

他们最终是一样的。

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

编辑:

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

一个基本循环怎么会for比 lambda 慢数千倍?那是没有意义的。循环是迭代数据的最基本方式。lambda 做了什么比循环更令人难以置信的高级?

......他们没有。他们还没有执行。看哪:延期执行。

于 2013-06-24T04:47:44.237 回答
1

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

这意味着您链接到的基准非常错误(考虑到它所犯的其他错误,这并不奇怪),您应该根据可读性在两种形式之间做出决定。

于 2013-06-24T08:43:38.890 回答