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
ますか?
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
ますか?
それが重要な場合は、ベンチマークを行い、シナリオでより高速なソリューションを自分で確認する必要があります。
この場合、ElementAt は Enumerable 拡張メソッドであるため、2 番目のソリューションは遅くなることがほとんど保証されています。HashSet<T> が実装していない IList<T> の最適化されたパスがあります。したがって、IEnumerable<T> から N 個の要素を列挙する「通常の」パスを使用します。
最初のソリューションは確かに O(N) ですが、2 番目のソリューションは O(N^2) の複雑さを持っていることがわかります。
HashSet の他の高速な列挙はありますか? いいえ、そうは思いません。それがIEnumerableの目的です。しかし、これはあなたにとって十分な速さではありませんか?マイクロベンチマークは役に立たず、パフォーマンスがこれに縛られていないか心配です.
はい、両者には大きな違いがあります。
Enumerable.ElementAt(int)
は O(n) 操作であるため、2 番目の操作は O(n^2) 複雑です。
対照的に、列挙子を介してセットを列挙することは O(n) 操作です。