可能的重复:
是否应该避免使用 LINQ,因为它很慢? https://stackoverflow.com/questions/3769989/should-linq-be-avoided-because-its-slow
我喜欢 LINQ。正如我今天在另一篇文章中读到的“这是自切片面包以来最好的东西”,我完全同意。但在我工作的公司,其他人似乎都讨厌 LINQ。
几周前,我第一次使用 ReSharper,当我编码时,ReSharper 突然告诉我我的 foreach 循环可以转换为 LINQ 表达式。这对我来说就像魔法一样,我向我的同事展示了这一点。令我惊讶的是,他说:“我希望它能反过来工作,将 LINQ 变成循环。这样会快很多!”
那么 LINQ-to-Objects 真的那么慢吗?我自己尝试了一下。
当我运行以下示例几次时,我得到的 Elapsed Ticks 约为 350。
Stopwatch sw = new Stopwatch();
List<Person> personList = new List<Person>();
for (int i = 0; i < 5000; i++)
{
Person p = new Person() {ID = i};
personList.Add(p);
}
sw.Start();
Person searchPerson = null;
foreach (Person person in personList)
{
if (person.ID == 4321)
{
searchPerson = person;
break;
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
如果我将循环更改为 LINQ 查询(Resharper 将为我执行此操作),我会得到大约 900 的 ElapsedTicks。是循环的两倍多。
Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321);
看起来 LINQ 确实比较慢,如果你经常使用它,这可能是一个问题。在我们公司,我们拥有大量数据。那么,避免使用 LINQ 是正确的决定还是我们做错了什么?
是的,它更慢。然而,该延迟的一部分是一次性初始化延迟,而不是每次迭代延迟。在 100k 次迭代循环中,百分比差异要低得多。
需要注意的是,开发人员的时间是显著地比代码中的小性能损失更昂贵,除非客户打电话给您抱怨性能问题。编写可读且可维护的代码是much比微优化代码更重要。
正如埃里克·利珀特 (Eric Lippert) 完美指出的那样,仅当 LINQ 不够快时才应避免使用 https://stackoverflow.com/questions/3769989/should-linq-be-avoided-because-its-slow.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)