web-dev-qa-db-ja.com

.NET HashTable Vs辞書-辞書は同じくらい高速ですか?

DictionaryまたはHashTableを使用するタイミングと理由を把握しようとしています。私はここで少し検索をしましたが、辞書の一般的な利点について話している人々を見つけました。これは、ボクシングとアンボックスの利点をわずかなパフォーマンス向上に導く完全に同意しています。

しかし、辞書は、オブジェクトが挿入された順序で常に返されるわけではなく、ソートされていることも読みました。 HashTableとしての場所。私が理解しているように、これにより、状況によってはHashTableがはるかに高速になります。

私の質問は本当に、これらの状況は何でしょうか?上記の私の仮定は間違っていますか?どちらを選択するのにどのような状況を使用できますか(はい、最後の状況は少しあいまいです)。

264
Jon

System.Collections.Generic.Dictionary<TKey, TValue>クラスとSystem.Collections.Hashtableクラスは両方とも、ハッシュテーブルデータ構造を内部的に維持します。 それらのどれもアイテムの順序を保持することを保証しません。

ボクシング/アンボクシングの問題は別として、ほとんどの場合、非常によく似たパフォーマンスが必要です。

それらの間の主な構造上の違いは、Dictionarychaining(各ハッシュテーブルバケットのアイテムのリストを維持する)に依存して衝突を解決するのに対し、Hashtablerehashing(衝突が発生した場合、別のハッシュ関数を使用してキーをバケットにマッピングします)。

.NET Framework 2.0以降をターゲットにしている場合は、Hashtableクラスを使用してもほとんど利点はありません。 Dictionary<TKey, TValue>によって効果的に廃止されます。

288
Mehrdad Afshari

今では何の意味もありません。しかし、単に立ち止まる人々のための参考のために

パフォーマンステスト-SortedList vs.SortedDictionary vs.Dictionary vs.Hashtable

105
Abdul Munim

HashtableとDictionaryの違い

辞書:

  • 存在しないキーを見つけようとすると、辞書はエラーを返します。
  • ボックス化とボックス化解除がないため、ハッシュテーブルよりも高速な辞書
  • 辞書は汎用タイプであるため、どのデータ型でも使用できます。

ハッシュ表:

  • 存在しないキーを見つけようとすると、Hashtableはnullを返します。
  • ボックス化とボックス化解除が必要なため、ハッシュテーブルは辞書より遅くなります。
  • ハッシュテーブルはジェネリック型ではありませんが、
28
user2771704

もう1つの重要な違いは、Hashtable型はロックフリーの複数のリーダーと単一のライターを同時にサポートしますが、Dictionaryはサポートしないことです。

23
Steven

MSDNの記事:「Dictionary<TKey, TValue>クラスの機能はHashtablename__クラスと同じです。特定のタイプ(Objectname__以外)のDictionary<TKey, TValue>は、Hashtablename__の要素がHashtablename__であるため、値型のObjectname__よりもパフォーマンスが優れています。値の型を保存または取得する場合、通常、ボックス化解除が発生します」。

リンク: http://msdn.Microsoft.com/en-us/library/4yh14awz(v = vs.90).aspx

15

両方とも事実上同じクラスです(逆アセンブリを見ることができます)。 HashTableは、.Netにジェネリックが含まれる前に最初に作成されました。ただし、辞書は汎用クラスであり、強力なタイピングの利点があります。辞書を使用するのに費用がかからないため、HashTableは使用しません。

11
Adam Luter

もう1つの重要な違いは、Hashtableがスレッドセーフであることです。 Hashtableには、複数のリーダー/シングルライター(MR/SW)スレッドセーフが組み込まれています。つまり、Hashtableは、ロックなしで複数のリーダーと1つのライターを許可します。 Dictionaryの場合、スレッドセーフはありません。スレッドセーフが必要な場合は、独自の同期を実装する必要があります。

さらに詳しく説明するには:

Hashtableは、コレクションのスレッドセーフラッパーを返すSynchronizedプロパティを通じてスレッドセーフを提供します。ラッパーは、追加または削除操作ごとにコレクション全体をロックすることにより機能します。したがって、コレクションにアクセスしようとする各スレッドは、順番に1つのロックを取得するまで待機する必要があります。これはスケーラブルではなく、大規模なコレクションのパフォーマンスが大幅に低下する可能性があります。また、設計は競合状態から完全に保護されていません。

List<T>Dictionary<TKey, TValue>などの.NET Framework 2.0コレクションクラスは、スレッドの同期を提供しません。アイテムが複数のスレッドで同時に追加または削除される場合、ユーザーコードはすべての同期を提供する必要があります。詳細はこちら。

7
NullReference

辞書には汎用タイプであるという利点があります。これにより、ボクシングの必要性がないため、タイプセーフで少し速くなります。次の 比較表 (同様のSOで見つかった回答を使用して構築 質問投稿 )は、ハッシュ表(またはその逆)。

2
janeon

オブジェクトが辞書に挿入された順序で常に返される読み取りを気にする場合は、

OrderedDictionary -整数のインデックスを介して値にアクセスできます(アイテムが追加された順序) SortedDictionary -アイテムは自動的にソートされます

1
ToXinE