3

这些场景中的哪一个会更快?

场景一:

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

    // Do something cool.
}

场景二:

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.
} 

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

4

4 回答 4

6

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

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

LINQ 更快还是更方便?

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

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

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

为什么?

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

于 2010-12-08T18:10:53.677 回答
2

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

与此相比,LINQ 的额外开销只是噪音。

于 2010-12-08T18:17:21.067 回答
1

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

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

于 2010-12-08T18:39:03.590 回答
0

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

请看一下。

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

我了解您正在查看本地文件解析,本文将让您了解所涉及的内容以及 linq 在幕后所做的事情。

于 2010-12-08T18:14:44.163 回答