.where(...)之间的性能差异.Any()vs ..Any(...)

时间:2012-05-29 13:52:15

标签: c# linq-to-objects

  

可能重复:
  LINQ extension methods - Any() vs. Where() vs. Exists()

给定内存中的对象列表,我运行了以下两个表达式:

myList.where(x => x.Name == "bla").Any() 

vs

myList.Any(x => x.Name == "bla")

后者总是最快的,我相信这是由于枚举所有项目的地方。但是当没有匹配时也会发生这种情况。

我不确定为什么会这样。是否存在这种观察到的性能差异的情况,例如它是否在查询Nhib?

干杯。

3 个答案:

答案 0 :(得分:8)

带谓词的Any()可以在没有迭代器(yield return)的情况下执行其任务。使用Where()创建一个迭代器,这会增加性能影响(虽然非常小)。

因此,在性能方面(稍微一点),您最好使用采用谓词(Any())的x => x.Name == "bla"形式。我个人认为,这也更具可读性......

在旁注中,Where()不一定要枚举所有元素,它只是创建一个迭代器,它将在请求时遍历元素,因此在{{Any()之后调用Where() 1}}将驱动迭代,迭代将在找到的匹配条件的第一个项目处停止。

所以性能差异 Where()遍历所有项目(在linq-to-objects中),因为它确实不需要(当然,除非找不到满足它的那个),所以Where()子句必须设置迭代器来遍历元素,而带有谓词的Any()则不然。

答案 1 :(得分:2)

假设您将where更改为Where=更改为==,我希望“Any带有谓词”版本来执行非常快一点。但是,我认为差异显着的情况很少,所以你应该首先瞄准可读性。

实际上,我通常更喜欢“Any带有谓词”版本的可读性,所以你在两个方面都获胜 - 但是你应该首先选择你认为更具可读性的版本。 测量您实际关注的场景中的性能,如果某段代码没有按照您的需要执行,那么会考虑对其进行微观优化 - 每次测量一步,当然。

答案 2 :(得分:0)

  

我认为这是由于枚举所有项目的位置。

如果myList是内存中的集合,则不会。 Where方法使用延迟执行,因此它只会枚举确定结果所需的项目数。在这种情况下,您不会在.Any(...).Where(...).Any()之间看到任何显着差异。

  

是否存在这种观察到的性能差异的情况   是这样,就像是在询问Nhib一样?

是的,如果myList是一个数据源,它将采用方法生成的表达式并转换为在其他地方运行的查询(例如LINQ To SQL),您可能会看到不同之处。翻译表达式的代码在翻译其中一个表达式方面做得更好。