我喜欢LINQ。正如我今天在另一篇文章中读到的那样“这是切片面包以来最好的东西”,我完全赞同。但在我工作的公司,其他人似乎都讨厌LINQ。
几个星期前,我第一次使用ReSharper,当我编写ReSharper时突然告诉我,我的foreach-loop可以转换为LINQ表达式。这对我来说就像魔术,我展示了我的同事。令我惊讶的是,他说:“我希望它可以反过来工作并将LINQ变成循环。那会更快!“
LINQ-to-Objects真的那么慢吗?我试过自己。 当我运行以下几次样本时,我会得到350左右的Elapsed Ticks。
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-Query(Resharper将为我执行此操作),我将获得大约900的ElapsedTicks。是循环的两倍多。
Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321);
看来LINQ确实比较慢,如果你经常使用它,这可能是一个问题。在我们公司,我们有很多数据。那么,正确的决定是避免使用LINQ还是我们做错了什么?
答案 0 :(得分:12)
是的,它的速度较慢。但是,该延迟的一部分是一次初始化延迟,而不是每次迭代延迟。在100k迭代循环中,百分比差异相当低。
要点的是,开发人员的时间显着比代码中的小型性能损失更昂贵,除非客户打电话给你抱怨性能问题。编写可读和可维护的代码 比微优化代码更重要。
Eric Lippert如此完美地指出,LINQ should only be avoided if it's not fast enough。