哪个场景会更快?
情景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.
}
我知道它们在逻辑上是相同的,因为延迟执行,但哪个会更快?为什么?
答案 0 :(得分:6)
更快通常不是问题本身,特别是在这样的场景中,不会出现有意义的性能差异(一般来说,如果代码不是瓶颈,那就无关紧要)。问题是更具可读性,更清楚地表达了代码的意图。
我认为第二个代码块更清楚地表达了代码的意图。它读作“查询具有特定属性的某些文件名的文件名集合”,然后“对于具有该属性的每个文件名,执行某些操作”。它宣告正在发生的事情,而不是它将如何发生。将机制与机制分开是使第二个代码块更清晰以及LINQ真正发挥作用的原因。使用LINQ来声明什么,让LINQ实现机制而不是过去那些与机制混淆的机制。
LINQ更快还是更方便?
因此,为了回答你标题中的问题,LINQ通常不会对性能产生重大影响,但它允许编码人员声明他们想要做什么而不必专注于他们想要完成的事情,从而使代码更加清晰。在一天结束时,我们不关心如何,我们关心什么。
我知道它们在逻辑上是相同的,因为延迟执行,但哪个会更快?
可能是命令式版本,因为使用LINQ会产生很少的开销。但如果您真的必须知道哪个更快,请务必使用分析器,并确保测试真实数据。
为什么?
因为LINQ增加了一点开销。但是,权衡更明确,代码更易于维护。与通常无关的性能损失相比,这是一个巨大的胜利。
答案 1 :(得分:2)
如果目录包含大量文件或位于网络驱动器上,则执行GetFiles("*.txt")
和GetFile("*.bin")
会更快。
与此相比,LINQ的额外开销只是噪音。
答案 2 :(得分:1)
Linq不是更快,并不是真正的便利性。相反,Linq将高阶函数Fold,Map和Filter拉入.NET(具有不同的名称)。这些函数很有价值,因为它们允许我们DRY - 我们的代码。每次使用辅助集合或结果设置迭代时,您都会遇到错误。 Linq允许您专注于迭代内部发生的事情,并且相信迭代机制没有错误。
这并不意味着Linq严格比手动迭代慢。正如其他人所提到的,你将不得不逐案进行基准测试。
答案 3 :(得分:0)
我写了一篇关于Code Project的文章,对linq和Stored过程进行了基准测试,并使用了编译的linq。
请看一下。
http://www.codeproject.com/KB/cs/linqsql2.aspx
我知道您正在查看本地文件解析,本文将让您了解所涉及的内容以及linq在幕后所做的事情。