枚举Hashset的速度

时间:2013-06-18 22:51:15

标签: c# performance hashset

C#中Hashset<string>的这两个枚举之间是否有任何性能差异?

foreach(string value1 in Hashset1) {

}

for(int i = 0; i < Hashset1.Count; i++) {
    string _value1 = Hashset1.ElementAt(i);
}

Hashset还有其他快速枚举(性能明智)吗?

2 个答案:

答案 0 :(得分:7)

如果重要,您应该进行基准测试,亲眼看看您的方案中哪种解决方案更快。

在这种情况下,第二个解决方案几乎可以保证较慢,因为ElementAt是一个Enumerable扩展方法。它具有IList&lt; T&gt;的优化路径,其中HashSet&lt; T&gt;没有实现。因此,它需要从您的IEnumerable&lt; T&gt;枚举N个元素的“正常”路径。

你可以自己弄清楚你的第二个解决方案是否具有O(N ^ 2)复杂度,而第一个解决方案肯定是O(N)。

还有其他快速枚举HashSet吗?不,我不这么认为。这就是IEnumerable的用途。但这对你来说不够快吗?微基准测试是没用的,我担心你的表现是否受此限制。

答案 1 :(得分:3)

是的,两者之间存在巨大差异。

Enumerable.ElementAt(int)是一个O(n)操作,所以你的第二个操作具有O(n ^ 2)复杂度。

相反,通过枚举器枚举集合是O(n)操作。

相关问题