Performance of HashSet<T> and Linq queries

本文关键字:and Linq queries gt of lt Performance HashSet | 更新日期: 2023-09-27 18:14:15

上周我收到了一些代码,并被要求改进性能。所以开始了这项工作,但很快我就发现他们使用了很多HashSet<T>对象来存储大的对象集合(在10000到100000多个对象之间)。在代码中,出于性能考虑,他们使用HashSet<T>

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

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

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

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

谢谢。

Performance of HashSet<T> and Linq queries

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

要获得HashSet<T>的最佳优势,您需要使用ISet<T>方法,理想情况下使用另一个HashSet<T>,因为查看代码,它针对这种情况进行了优化。此外,只有利用成员对象的哈希码(如相等性测试),操作才会更快,因为HashSet<T>的性能是基于哈希查找的0(1)性能特征。不使用成员哈希码的操作,比如对成员属性和成员本身进行过滤,将需要进行O(N)操作,使其与List<T>相同。