.NET HashTable Vs Dictionary – Kann das Wörterbuch so schnell sein?

Ich versuche herauszufinden, wann und warum ich ein Dictionary oder HashTable verwende. Ich habe hier ein wenig gesucht und habe Leute gefunden, die über die generischen Vorteile des Wörterbuchs sprechen, denen ich voll und ganz zustimme, was den Box- und Unboxing-Vorteil für einen leichten performancesgewinn bringt.

Aber ich habe auch gelesen, dass das Dictionary die Objekte nicht immer in der Reihenfolge zurückgibt, in der sie eingefügt sind, sondern sortiert ist. Wo als HashTable. Wie ich es verstehe, führt dies dazu, dass die HashTable in einigen Situationen viel schneller ist.

Meine Frage ist wirklich, was könnten diese Situationen sein? Bin ich nur falsch in meinen obigen Annahmen? In welchen Situationen könntest du eine über der anderen wählen (ja die letzte ist ein bisschen mehrdeutig).

   

System.Collections.Generic.Dictionary classn System.Collections.Generic.Dictionary und System.Collections.Hashtable pflegen intern eine Hashtabellen-Datenstruktur. Keiner von ihnen garantiert die Erhaltung der Reihenfolge der Gegenstände.

Wenn man Boxen / Unboxing-Probleme beiseite lässt, sollten sie die meiste Zeit sehr ähnliche performanceen haben.

Der wichtigste strukturelle Unterschied zwischen ihnen besteht darin, dass das Dictionary auf die Verkettung (Beibehaltung einer Liste von Elementen für jeden Hashtabellenbereich) zur Auflösung von Kollisionen Hashtable , während Hashtable für die Kollisionsauflösung eine Hashtable verwendet (wenn eine Kollision auftritt), wird der Schlüssel einer anderen Hashfunktion zugeordnet Eimer).

Die Verwendung der Hashtable class bietet wenig Vorteile, wenn Sie auf .NET Framework 2.0+ abzielen. Es wird effektiv durch Dictionary veraltet.

Ich schätze, es bedeutet dir jetzt nichts. Aber nur als Referenz für Leute, die vorbeischauen

performancestest – SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

Ein weiterer wichtiger Unterschied besteht darin, dass der Hashtable-Typ mehrere Lock-Reader und einen Writer gleichzeitig unterstützt, das Dictionary hingegen nicht.

Unterschiede zwischen Hashtable und Dictionary

Wörterbuch:

  • Das Wörterbuch gibt einen Fehler zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.
  • Wörterbuch schneller als eine Hashtable, weil es kein Boxen und Unboxing gibt.
  • Das Dictionary ist ein generischer Typ, was bedeutet, dass wir es mit jedem Datentyp verwenden können.

Hash-tabelle:

  • Hashtable gibt null zurück, wenn wir versuchen, einen Schlüssel zu finden, der nicht existiert.
  • Hashtable langsamer als Dictionary, da es Boxen und Unboxing erfordert.
  • Hashtable ist kein generischer Typ,

MSDN Artikel: “Die Dictionary -class hat die gleiche functionalität wie die Hashtable class. Ein Dictionary eines bestimmten Typs (außer Object ) hat eine bessere performance als eine Hashtable für Dictionary weil die Elemente von Hashtable sind vom Typ Object und daher treten Boxing und Unboxing normalerweise auf, wenn ein Werttyp gespeichert oder abgerufen wird “.

Link: http://msdn.microsoft.com/en-us/library/4yh14awz(v=vs.90).aspx

Beide sind effektiv die gleiche class (Sie können die Demontage betrachten). HashTable wurde zuerst erstellt, bevor .Net Generika hatte. Das Wörterbuch ist jedoch eine generische class und gibt Ihnen starke Tippvorteile. Ich würde HashTable niemals verwenden, da das Wörterbuch Sie nichts kostet.

Ein weiterer wichtiger Unterschied ist, dass Hashtable threadsicher ist. Hashtable hat mehrere Threads für den Leser / Einzelschreiber (MR / SW) eingebaut, was bedeutet, dass Hashtable einen Schreiber mit mehreren Lesern ohne Sperren ermöglicht. Bei Dictionary gibt es keine Threadsicherheit, wenn Sie Threadsicherheit benötigen, müssen Sie Ihre eigene Synchronisation implementieren.

Weiter zu erarbeiten:

Hashtable bietet eine Thread-Sicherheit durch die Synchronized-Eigenschaft, die einen Thread-sicheren Wrapper um die Auflistung zurückgibt. Der Wrapper funktioniert, indem die gesamte Sammlung bei jedem Hinzufügen oder Entfernen gesperrt wird. Daher muss jeder Thread, der auf die Sammlung zugreifen möchte, warten, bis er an der Reihe ist, die eine Sperre zu übernehmen. Dies ist nicht skalierbar und kann bei großen Sammlungen zu erheblichen performanceseinbußen führen. Außerdem ist das Design nicht vollständig vor den Rennbedingungen geschützt.

Die Auflistungsklassen von .NET Framework 2.0 wie List , Dictionary usw. bieten keine Thread-Synchronisierung. Benutzercode muss die gesamte Synchronisierung bereitstellen, wenn Elemente gleichzeitig zu mehreren Threads hinzugefügt oder entfernt werden Wenn Sie sowohl die Typsicherheit als auch die Threadsicherheit benötigen, verwenden Sie in .NET Framework classn mit gleichzeitigen Auflistungen. Weitere Informationen hier.

Wenn Sie beim Lesen darauf achten, dass die Objekte immer in der Reihenfolge zurückgegeben werden, in der sie in ein Dictionary eingefügt wurden, sehen Sie sich das an

OrderedDictionary – Werte können über einen Integer-Index abgerufen werden (nach Reihenfolge, in der Elemente hinzugefügt wurden) SortedDictionary – Elemente werden automatisch sortiert

Das Wörterbuch ist schneller als die Hashtabelle, da das Wörterbuch ein generischer starker Typ ist. Hashtable ist langsamer, da es ein Objekt als Datentyp akzeptiert, was zum Boxing und Unboxing führt.