LINQ更快还是更方便?
-
10-10-2019 - |
题
哪些方案将更快?
方案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。
请看一下。
http://www.codeproject.com/kb/cs/linqsql2.aspx
我了解您正在查看本地文件解析,这篇文章将使您了解涉及什么以及Linq在幕后所做的事情。