【问题标题】:Performance of HashSet<T> and Linq queriesHashSet<T> 和 Linq 查询的性能
【发布时间】:2011-12-27 22:53:02
【问题描述】:

上周我收到了一些代码,并被要求改进性能。所以开始了这项工作,但很快我就看到他们使用了很多 HashSet&lt;T&gt; 对象来存储大量对象(在 10000 到 100000 多个对象之间)。出于性能原因,他们在代码中使用HashSet&lt;T&gt;

他们唯一要做的就是用对象填充 HashSet,然后使用一些 Linq 在多个集合之间执行查询。大多数查询是加入 1 或 n 个 HashSet,或使用 First()Where() 从集合中检索特定对象。

我想知道与普通的List&lt;T&gt; 相比,我们是否获得了任何性能优势?因为他们在代码中使用的所有 Linq 扩展方法都是为 IEnumerable&lt;T&gt; 编写的。

网上很多文章都说 List 会更快,但也有人说 HashSet 处理大集合比 List 好很多。

希望有人能给我更多的建议。

谢谢。

【问题讨论】:

  • 你不能轻松地写一个测试来比较这两者的性能吗?
  • 我还要注意 HashSet 没有排序 - 取其 First 元素是错误的,除非您需要任意元素,或者已经过滤了除一个元素之外的所有元素。
  • 您的方法非常低效。使用分析器。

标签: c# performance linq-to-objects hashset


【解决方案1】:

如果您只使用 LINQ 查询,则不会获得任何性能优势,因为您只是在枚举整个集合。事实上,List&lt;T&gt; 的性能可能更好,因为它是连续的内部存储。

要获得HashSet&lt;T&gt; 的性能优势,您需要使用ISet&lt;T&gt; 方法,最好使用另一个HashSet&lt;T&gt;,因为查看代码,它已针对这种情况进行了优化。此外,利用成员对象的哈希码(如相等测试)的操作只会更快,因为HashSet&lt;T&gt; 的性能基于哈希查找的 O(1) 性能特征。不使用成员哈希码的操作,例如过滤成员属性与成员本身,需要 O(N) 操作,使其与 List&lt;T&gt; 相同。

【讨论】:

    猜你喜欢
    • 2015-10-16
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多