查询表达式 vs Lambda表达式

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倍,这真的值得吗?”

1
我认为这个问题可能已经在这个问题中讨论过了,但并没有得出结论。 - Alvin Wong
3
如果我只能向人们传达关于LINQ的一件事,那就是:查询表达式的结果是一个“查询”,而不是执行查询的结果。你会发现,“提出问题”比“回答问题”要快得多,这并不奇怪。 - Eric Lippert
2个回答

10

它们最终是相同的。

你的文章测试看起来非常快,这是因为使用了“延迟执行”。当计时区域的代码实际上并不执行任何操作。只有当调用.ToList()或其他强制查询评估的方法(lambda或其他方法)时才会执行。解释查询非常快(根据您提供的时间),但在查询被评估时循环数据则完全不同。

编辑:

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

基本的for循环如何比lambda慢数千倍?这毫无意义。循环是迭代数据的最基本方式。那么lambda做了什么比循环更高级呢?

...他们没有执行。请看:延迟执行。


感谢您的见解。值得指出的是,即使是“非常快速”的查询在高需求的应用程序中也可能变得重要(考虑500,000个并发用户的情况),因此在这种级别上进行微观优化是一个好习惯,只要可以进行。 - Chris Halcrow

1
编译器将查询表达式转换为使用lambda的查询。这意味着这两个示例将编译为完全相同的代码,因此不会有性能差异。
这意味着您链接的基准测试非常错误(考虑到它所犯的其他错误,这并不令人惊讶),因此您应该根据可读性在这两种形式之间做出决定。

可能是因为缓存的原因,先执行的那个查询需要更长时间来构建。如果你交换它们的顺序,基准测试可能会显示 lambda 版本更快。 - Chris Walsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接