1

Hashset<string>C#の a のこれら 2 つの列挙の間にパフォーマンスの違いはありますか?

foreach(string value1 in Hashset1) {

}

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

a の他の高速な列挙 (パフォーマンスに関して) はありHashsetますか?

4

2 に答える 2

8

それが重要な場合は、ベンチマークを行い、シナリオでより高速なソリューションを自分で確認する必要があります。

この場合、ElementAt は Enumerable 拡張メソッドであるため、2 番目のソリューションは遅くなることがほとんど保証されています。HashSet<T> が実装していない IList<T> の最適化されたパスがあります。したがって、IEnumerable<T> から N 個の要素を列挙する「通常の」パスを使用します。

最初のソリューションは確かに O(N) ですが、2 番目のソリューションは O(N^2) の複雑さを持っていることがわかります。

HashSet の他の高速な列挙はありますか? いいえ、そうは思いません。それがIEnumerableの目的です。しかし、これはあなたにとって十分な速さではありませんか?マイクロベンチマークは役に立たず、パフォーマンスがこれに縛られていないか心配です.

于 2013-06-18T23:01:35.980 に答える
3

はい、両者には大きな違いがあります。

Enumerable.ElementAt(int)は O(n) 操作であるため、2 番目の操作は O(n^2) 複雑です。

対照的に、列挙子を介してセットを列挙することは O(n) 操作です。

于 2013-06-18T23:00:29.953 に答える