LINQ的.Where()是否会比O(N)快?

时间:2010-06-30 10:55:49

标签: linq performance big-o

认为标题很好地描述了我的想法:)

我最近看到很多人向LINQ发誓,虽然我也相信它很棒,但我也认为你不应该对大多数(所有?)IEnumerable类型的事实感到困惑,它的表现是不是很好。这是错误的吗?特别是在大型数据集上嵌套Where()的查询?

很抱歉,如果这个问题有点模糊,我只想确认一下,在使用LINQ时你应该“谨慎”。

[编辑]只是为了澄清 - 我在想Linq to Objects这里:)

3 个答案:

答案 0 :(得分:3)

这取决于提供商。对于Linq to Objects,它将是O(n),但对于Linq to SQL或Entities,它最终可能会使用索引来击败它。对于Objects,如果你需要Where的功能,你可能还需要O(n)。 Linq 几乎肯定会有一个更大的常量,主要是由于函数调用。

答案 1 :(得分:3)

这取决于您如何使用它以及您比较的内容。

我已经看到很多使用foreache的实现,而linq会更快。例如。因为他们忘了打破或因为他们回来的东西太多了。诀窍是在实际使用项目时执行lambda表达式。当你最后有First时,它最终可能只有一个电话。

因此,当您链接Where时,如果某个项目未通过第一个条件,则也不会针对第二个条件进行测试。它与&&运算符类似,如果不满足第一个运算符,它不会评估右侧的条件。

你可以说它总是O(N)。但是N不是源中的项目数,而是创建目标集所需的最小项目数。这是一个非常好的优化恕我直言。

答案 2 :(得分:2)

这是一个承诺为LINQ2Objects引入索引的项目。这应该会提供更好的渐近行为:http://i4o.codeplex.com/