【问题标题】:Is LINQ faster or just more convenient?LINQ 更快还是更方便?
【发布时间】:2010-12-08 18:06:23
【问题描述】:

以下哪种情况会更快?

场景一:

foreach (var file in directory.GetFiles())
{
    if (file.Extension.ToLower() != ".txt" &&
        file.Extension.ToLower() != ".bin")
        continue;

    // Do something cool.
}

场景 2:

var files = from file in directory.GetFiles()
                where file.Extension.ToLower() == ".txt" ||
                      file.Extension.ToLower() == ".bin"
                select file;

foreach (var file in files)
{
     // Do something cool.
} 

我知道由于执行延迟,它们在逻辑上是相同的,但哪个更快?为什么?

【问题讨论】:

  • 为什么不让他们看几个样本看看会发生什么?
  • 分析器来救援!
  • 我对理论的兴趣多于实践。我真的很想了解这一点。

标签: linq performance delayed-execution


【解决方案1】:

更快本身通常不是问题,尤其是在这样的场景中,不会产生有意义的性能差异(通常,如果代码不是瓶颈,那就没关系了)。问题在于哪个更易读,更清楚地表达了代码的意图。

我认为第二段代码更清楚地表达了代码的意图。它读作“查询具有特定属性的某些文件名的文件名集合”,然后“对于具有该属性的每个文件名,做一些事情”。它声明正在发生的事情,而不是它将如何发生。将内容与机制分开是使第二个代码块更清晰的原因,也是 LINQ 真正闪耀的地方。用 LINQ 声明什么,让 LINQ 实现机制,而不是过去什么会和机制混为一谈。

LINQ 是更快还是更方便?

因此,要回答您标题中的问题,LINQ 通常不会严重影响性能,但它通过允许编码人员声明他们想要做什么而不是必须专注于他们想要如何完成某事,从而使代码更加清晰。归根结底,我们不在乎如何,我们在乎的是什么。

我知道由于执行延迟,它们在逻辑上是相同的,但哪个更快?

可能是命令式版本,因为使用 LINQ 的开销很小。但是,如果您确实必须知道哪个更快,请务必使用分析器,并确保使用真实数据进行测试。

为什么?

因为 LINQ 增加了一点开销。但权衡是更清晰和更可维护的代码。与通常不相关的性能损失相比,这是一个巨大的胜利。

【讨论】:

  • 我对 LINQ 理论最感兴趣。我对延迟执行和它的收​​益回报着迷;它如何将多个代码循环组合成一个循环。什么与如何相反,我从来没有真正这样想过。我只是新写的更有趣。谢谢。 :)
【解决方案2】:

如果目录包含大量文件或位于网络驱动器上,则执行GetFiles("*.txt")GetFile("*.bin") 会更快。

相比之下,LINQ 的额外开销只是噪音。

【讨论】:

  • 我的实际项目是引用一个带有少量已知扩展的缓存目录。
【解决方案3】:

Linq 并不快,也不是为了方便。相反,Linq 将高阶函数 FoldMapFilter 拉入 .NET(具有不同的名称)。这些函数很有价值,因为它们允许我们DRY-up 我们的代码。每次您使用次要集合或结果设置迭代时,您都会遇到错误。 Linq 让您可以专注于迭代内部发生的事情,并对迭代机制没有错误充满信心。

这并不意味着 Linq 严格来说比手动迭代慢。正如其他人所提到的,您必须逐案进行基准测试。

【讨论】:

    【解决方案4】:

    我写了一篇关于代码项目的文章,它对 linq 和存储过程以及使用编译的 linq 进行了基准测试。

    请看一下。

    http://www.codeproject.com/KB/cs/linqsql2.aspx

    我了解您正在研究本地文件解析,本文将让您了解其中涉及的内容以及 linq 在幕后所做的工作。

    【讨论】:

    • 我不太关心 LINQ to SQL。为什么每个人都认为我在谈论 LINQ to SQL?微软发布了一项很棒的技术,每个人都只使用它的 ORM 部分!对不起,我的问题应该更清楚。除了 SQL 之外,我还关心 LINQ。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多