哪些方案将更快?

方案1:

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真正发光的位置。使用Linq声明什么,并让Linq实施该机制,而不是在过去的机制中实现机制。

LINQ更快还是更方便?

因此,要回答标题中的问题,LINQ通常不会实质性地阻碍性能,但是通过允许编码器声明他们想要做的事情,而不必专注于他们想要做的事情,则可以使代码更加清晰。归根结底,我们不在乎如何,我们关心什么。

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

可能是命令式版本,因为使用LINQ时有很少的开销。但是,如果您真的必须知道哪个更快的速度,请务必使用剖面,并确保对现实世界数据进行测试。

为什么?

因为Linq添加了一些开销。但是,权衡取决于明确和更可维护的代码。与通常无关的性能损失相比,这是一个巨大的胜利。

其他提示

做一个会更快 GetFiles("*.txt")GetFile("*.bin") 如果目录包含大量文件或在网络驱动器上。

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

Linq并不快,这并不是真正的便利性。相反,LINQ拔出高阶功能 折叠, 地图, , 和 筛选 进入.NET(具有不同的名称)。这些功能很有价值,因为它们使我们能够 干燥- 我们的代码。每次您设置带有次要集合或结果的迭代时,您都会对错误开放。 LINQ使您可以专注于迭代内部发生的事情,并对迭代机制无漏洞感到有信心。

这并不意味着LINQ严格慢于手动迭代。正如其他人提到的那样,您必须逐案基准。

我写了一篇有关代码项目的文章,该文章对LINQ和存储过程进行了基准测试,并使用了编译的LINQ。

请看一下。

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

我了解您正在查看本地文件解析,这篇文章将使您了解涉及什么以及Linq在幕后所做的事情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top