LINQ比简单循环慢得多吗?

Tal*_*ode 4 linq performance

可能重复:
LINQ应该避免因为它很慢吗?

我喜欢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);
Run Code Online (Sandbox Code Playgroud)

如果我将循环更改为LINQ-Query(Resharper将为我执行此操作),我将获得大约900的ElapsedTicks.是循环的两倍多.

Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321);
Run Code Online (Sandbox Code Playgroud)

看起来LINQ确实比较慢,如果你经常使用它,这可能是一个问题.在我们公司,我们有很多数据.那么避免LINQ是正确的决定还是我们做错了什么?

Pol*_*ial 13

是的,它慢了.但是,该延迟的一部分是一次初始化延迟,而不是每次迭代延迟.在100k迭代循环中,百分比差异相当低.

带走的一点是,开发时间是显著的价格比在代码中一个小的性能损失,除非客户给你打电话抱怨性能问题.写作阅读和维护的代码是多少比微优化你的代码更重要.

正如Eric Lippert如此完美地指出的那样,只有在LINQ不够快的情况下才应该避免使用LINQ.