LINQ查询有很多开销吗?

M. *_*ley 21 .net linq performance

IEnumerable<T>轻量级还是重量级的简单LINQ查询?它们如何与手写forforeach循环比较?何时更喜欢LINQ与手动搜索有一般指导原则?

例如:

var lowNums =
    from n in numbers
    where n < 5
    select n;
Run Code Online (Sandbox Code Playgroud)

相比:

List<int> lowNums = new List<int>();

foreach (int n in numbers)
{
    if (n < 5)
    {
        lowNums.Add(n);
    }
}
Run Code Online (Sandbox Code Playgroud)

我和一位同事谈论LINQ,他对使用它表示了一些犹豫.他猜测为了支持LINQ可以做的一切,可能会在"幕后"进行大量工作.

以上示例之间是否存在显着的性能差异?是否有任何好的资源可以谈论集合上的LINQ性能?一个简单的Google搜索linq表现出现了一些看似过时的文章.

wom*_*omp 18

LINQ in Action的作者做了一些基准测试for, foreach, List<T>.FindAll,并且LINQ查询都做了同样的事情.根据查询的构造方式,LINQ只慢了大约10%.正如他们所说,

LINQ不是免费的.

LINQ是一个复杂的主题,但根据你用它做什么,它不需要增加很多开销.通常,LINQ的构建依赖于延迟执行,以节省内存和CPU,直到您真正需要它为止.

但是,您必须知道不同的查询运算符是如何工作的,因为更改查询流可能会大大改变它的执行方式.您描述的简单查询通常不是问题,但是运算符Reverse()和转换运算符可能会抛出一些问题,因为它们需要立即迭代结果集.通常有多种方法可以编写相同的查询,并且根据您构建它的方式,您可以查看最小的性能损失,或者可以使它比同等循环慢两倍.

它提供的便利性和简洁性远远超过我日常编码的大部分性能考虑因素.永远不要预先优化!


Jar*_*Par 16

这是我对LINQ的一般规则

当解决方案更具表现力时使用LINQ.当探查器证明LINQ查询是问题的根源时,只切换到表达力较低但速度较快的解决方案.


Jon*_*eet 10

调用委托有开销,但这通常很低.

然后是所涉及的所有迭代器的开销 - 通常在查询中每个extra子句有一个迭代器.再次,不是一个巨大的数额,但也不是什么.

你有实际应用吗?如果是这样,那么在LINQ中可以完成的性能有多重要?根据我的经验,这些位通常不是瓶颈,所以如果LINQ略微降低性能,那真的无关紧要.LINQ 可以为您的解决方案的可读性做出巨大贡献.

请注意,示例中的性能完全不同,因为这两段代码执行的操作非常不同.您的LINQ示例将在眨眼之间执行,因为它实际上并不运行查询 - 它只是设置它.如果调用ToList()在年底然后它基本上相当于你的第二个例子.在进行性能比较时,记住这一点非常重要!

另外要记住的是 - 您不必使用查询表达式语法.如果您只是过滤(或只是投影),我通常会发现使用普通的点符号调用扩展方法更有意义:

var lowNums = numbers.Where(n => n < 5);
Run Code Online (Sandbox Code Playgroud)

  • 我最近在工作中使用了LINQ to SQL构建了一个完整的应用程序......而且那个老派的sql家伙攻击了所有进入db的sql说这个linq垃圾很慢.ORM糟透了.所有通常的论点.当他爆发剖析器时,他发现实际上他的所有存储过程都很慢......并且LINQ表现得非常好!我笑了. (6认同)

Dan*_*plo 5

根据LINQ In Action (pg.198):

“LINQ 不是免费的。LINQ 查询会导致额外的工作、对象创建和垃圾收集器的压力。使用 LINQ 的额外成本可能因查询而异。它可以低至 5%,但可以有时大约是 500%。”