2011-11-13 5 views
3

先週、私はいくつかのコードを受け取り、パフォーマンスを改善するように求められました。だから仕事を始めましたが、すぐに私は彼らがたくさんのオブジェクトを使用して、大きなコレクションのオブジェクトを(10000から100000個以上のオブジェクトに)格納することを多くのHashSet<T>オブジェクトで確認しました。コードでは、パフォーマンス上の理由からHashSet<T>を使用します。HashSetのパフォーマンス<T>およびLinqクエリ

彼らが行う唯一のことは、オブジェクトでHashSetを埋め込み、その後複数のコレクション間でクエリを実行するLinqです。ほとんどのクエリは、1またはn HashSetを結合しているか、First()またはWhere()でコレクションから特定のオブジェクトを取得しています。

普通のList<T>と比較してパフォーマンス上の利点があるのでしょうか?コードで使用するすべてのLinq拡張メソッドはIEnumerable<T>のために書かれています。

インターネット上では、Listのほうが速いと言われる記事がたくさんありますが、HashSetはListよりもはるかに優れたコレクションを処理していると言われる人もいます。

誰かが私に助言を与えることを望みます。

ありがとうございました。

+2

これらの両方のパフォーマンスを比較してテストを簡単に作成できませんでしたか? – row1

+1

また、HashSetが順序付けされていないことにも気づくでしょう - あなたが任意の要素を必要としないか、または既に1つの要素を除いてすべてをフィルタリングしていない限り、 'First'要素は間違っています。 – Kobi

+2

あなたのアプローチは非常に非生産的です。プロファイラを使用します。 –

答えて

9

LINQクエリだけを使用すると、コレクション全体を列挙するだけであるため、パフォーマンスが向上しません。実際には、連続した内部ストレージのためにList<T>がより優れたパフォーマンスになる可能性があります。

HashSet<T>のPERFの利益を取得するには、コードを見て、それはこの場合のために最適化され、以来、理想的に別のHashSet<T>で、ISet<T>メソッドを使用する必要があります。 HashSet<T>のパフォーマンスはハッシュルックアップのO(1)パフォーマンス特性に基づいているため、同等性テストのようなメンバオブジェクトのハッシュコードを利用する操作は高速になります。メンバのプロパティに対するフィルタリングのようなメンバのハッシュコードを使用しない操作は、O(N)操作である必要があり、List<T>と同じになります。

関連する問題