【问题标题】:Query expressions vs Lambda expressions [closed]查询表达式与 Lambda 表达式 [关闭]
【发布时间】:2013-06-24 04:37:16
【问题描述】:

使用查询表达式而不是 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 倍真的值得吗?

【问题讨论】:

  • 我认为这可能已经在this question 中讨论过,但还没有真正的结论。
  • 如果我只能告诉人们关于 LINQ 的一件事,那就是:查询表达式的结果是 查询。这不是执行查询的结果。您会发现写问题回答问题快得多,这并不奇怪。

标签: c# performance linq lambda query-expressions


【解决方案1】:

它们最终是一样的。

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

编辑:

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

基本的for 循环怎么会比 lambda 慢数千倍?那是没有意义的。循环是迭代数据的最基本方式。 lambda 做了什么比循环更先进的功能?

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

【讨论】:

  • 谢谢,您的回答帮助很大
  • 感谢您的洞察力。这里值得指出的是,即使是“非常快”的查询在高需求应用程序中也可能变得很重要(考虑 500,000 个并发用户的情况),因此这种级别的微优化是一个可以执行的好习惯.
【解决方案2】:

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

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

【讨论】:

  • 可能,由于缓存的原因,无论哪个先生成查询都需要更长的时间。如果您交换它们,基准可能会更快地显示 lambda 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多