LINQ是更快还是更方便?

LINQ是更快还是更方便?,linq,performance,delayed-execution,Linq,Performance,Delayed Execution,以下哪种情况会更快 情景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.GetF

以下哪种情况会更快

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

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

更快本身通常不是问题所在,特别是在这样的场景中,不会出现有意义的性能差异(一般来说,如果代码不是瓶颈,那就无关紧要了)。问题在于哪一个更具可读性,并且更清楚地表达了代码的意图

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

LINQ是更快还是更方便

因此,为了回答标题中的问题,LINQ通常不会对性能造成实质性的阻碍,但它允许编码人员声明他们想要做什么,而不必关注他们想要做什么,从而使代码更加清晰。归根结底,我们不在乎如何,我们在乎的是什么

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

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

为什么


因为LINQ增加了一点开销。但是,取舍是更清晰、更易于维护的代码。与通常无关的性能损失相比,这是一个巨大的胜利。

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

请看一看


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

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


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

LINQ并没有更快,也不是为了方便。相反,Linq将高阶函数拉入.NET(使用不同的名称)。这些函数很有价值,因为它们允许我们修改代码。每次使用第二个集合或结果设置迭代时,您都会遇到一个bug。Linq允许您关注迭代中发生的事情,并对迭代机制没有bug感到相当自信


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

为什么不让他们看几个样本,看看会发生什么?探查器来拯救他们!我对理论比对实践更感兴趣。我想好好研究一下,我主要对LINQ理论感兴趣。我着迷于延迟执行和它的收益回报;它如何将多个代码循环组合成一个循环。与如何相反,我从来没有这样想过。我只是觉得写起来更有趣。谢谢。:)我的实际项目是引用一个缓存目录,其中包含一个已知的小扩展集。为什么每个人都认为我说的是LINQ到SQL?微软发布了一项很棒的技术,每个人都在使用它的ORM部分!对不起,我应该更清楚地回答我的问题。我关心的是LINQ,而不是SQL。