关于性能:LINQ比简单循环慢得多吗?

Is LINQ much slower than a simple loop?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Should LINQ be avoided because it's slow?

我喜欢林肯。正如我今天在另一篇文章中读到的,"这是自切片面包以来最好的东西",我完全同意。但在公司里,我工作的每个人似乎都讨厌林肯。

几周前,我第一次使用Resharper,当我编写Resharper时,突然告诉我,我的foreach循环可以转换成linq表达式。这对我来说就像魔术,我给我的同事看。令我吃惊的是,他说:"我希望它能反过来工作,把LINQ变成循环。那就快多了!"

那么linq-to对象真的这么慢吗?我试过了。当我运行下面的示例几次时,我会得到350左右的经过时间刻度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        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次检查。比循环的两倍多。

1
Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321);

似乎Linq的速度确实较慢,如果您经常使用它,这可能是一个问题。我们公司有很多数据。那么,避免使用LINQ是正确的决定还是我们做错了什么?


是的,比较慢。但是,该延迟的一部分是一次性初始化延迟,而不是每次迭代的延迟。在100K迭代循环中,百分比差异要小得多。

需要注意的是,开发人员的时间比代码中的小性能损失要昂贵得多,除非客户打电话给您抱怨性能问题。编写可读和可维护的代码比微优化代码更重要。

正如埃里克·利珀特(EricLippert)完美地指出的,只有当Linq不够快时,才应该避免它。