.NET HashTable Vs Dictionary – Le dictionnaire peut-il être aussi rapide?

J’essaie de savoir quand et pourquoi utiliser un dictionnaire ou une table de hachage. J’ai fait un peu de recherche ici et j’ai trouvé des gens parlant des avantages génériques du dictionnaire avec lequel je suis totalement d’accord, ce qui conduit à l’avantage de la boxe et du déballage pour un léger gain de performance.

Mais j’ai aussi lu que le dictionnaire ne renverra pas toujours les objects dans l’ordre dans lequel ils sont insérés, chose qu’il est sortingé. Où en tant que HashTable sera. Si je comprends bien, cela signifie que la HashTable est beaucoup plus rapide dans certaines situations.

Ma question est vraiment, que pourraient être ces situations? Est-ce que je me trompe dans mes hypothèses ci-dessus? Quelles situations pourriez-vous utiliser pour choisir l’une au dessus de l’autre (oui, la dernière est un peu ambiguë).

System.Collections.Generic.Dictionary classes System.Collections.Generic.Dictionary et System.Collections.Hashtable conservent toutes deux une structure de données de table de hachage en interne. Aucun d’entre eux ne garantit la conservation de l’ordre des articles.

Laissant de côté les problèmes de boxing / unboxing, la plupart du temps, ils devraient avoir des performances très similaires.

La principale différence structurelle entre eux est que Dictionary repose sur le chaînage (maintien d’une liste d’éléments pour chaque compartiment de table de hachage) pour résoudre les collisions, tandis que Hashtable utilise le rehashing pour la résolution des collisions (lorsqu’une collision se produit, seau).

L’utilisation de la classe Hashtable présente peu d’intérêt si vous ciblez .NET Framework 2.0+. Il est effectivement rendu obsolète par Dictionary .

Je suppose que cela ne signifie rien pour vous maintenant. Mais juste pour la référence pour les personnes qui s’arrêtent par

Test de performance – SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

Une autre différence importante est que le type Hashtable prend en charge plusieurs lecteurs sans locking et un seul graveur en même temps, contrairement à Dictionary.

Différences entre Hashtable et Dictionary

Dictionnaire:

  • Le dictionnaire renvoie une erreur si nous essayons de trouver une clé qui n’existe pas.
  • Dictionnaire plus rapide qu’une Hashtable car il n’y a pas de boxe et unboxing.
  • Dictionary est un type générique, ce qui signifie que nous pouvons l’utiliser avec n’importe quel type de données.

Hashtable:

  • Hashtable renvoie null si nous essayons de trouver une clé qui n’existe pas.
  • Hashtable plus lent que le dictionnaire car il nécessite la boxe et le unboxing.
  • Hashtable n’est pas un type générique,

MSDN Article: “La classe Dictionary a les mêmes fonctionnalités que la classe Hashtable . Un Dictionary d’un type spécifique (autre Object ) a de meilleures performances qu’une Hashtable pour les types de valeur car les éléments de Hashtable sont du type Object et, par conséquent, la boxe et le unboxing se produisent généralement si vous stockez ou récupérez un type de valeur “.

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

Les deux sont effectivement la même classe (vous pouvez regarder le déassembly). HashTable a été créé avant que .Net ait des génériques. Dictionary, cependant, est une classe générique et vous offre des avantages de typage forts. Je n’utiliserais jamais HashTable puisque Dictionary ne vous coûte rien à utiliser.

Une autre différence importante est que Hashtable est Hashtable threads. Hashtable intègre la sécurité des threads multi-lecteurs / graveurs (MR / SW), ce qui signifie que Hashtable permet à un seul graveur et à plusieurs lecteurs de se verrouiller. Dans le cas du Dictionary il n’y a pas de sécurité des threads, si vous avez besoin de sécurité des threads, vous devez implémenter votre propre synchronisation.

Elaborer plus avant:

Hashtable , fournit une certaine sécurité des threads via la propriété Synchronized, qui retourne un wrapper thread-safe autour de la collection. Le wrapper fonctionne en verrouillant la collection entière sur chaque opération d’ajout ou de suppression. Par conséquent, chaque thread qui tente d’accéder à la collection doit attendre son tour pour prendre le verrou unique. Cela n’est pas évolutif et peut entraîner une dégradation significative des performances pour les grandes collections. De plus, le design n’est pas complètement protégé des conditions de course.

Les classes de collection .NET Framework 2.0 telles que List , Dictionary , etc. ne fournissent aucune synchronisation de threads; Le code utilisateur doit fournir toute la synchronisation lorsque des éléments sont ajoutés ou supprimés simultanément sur plusieurs threads Si vous avez besoin de la sécurité des types et de la sécurité des threads, utilisez des classes de collections simultanées dans .NET Framework. Plus de lecture ici.

Si vous vous intéressez à la lecture, cela renverra toujours les objects dans l’ordre dans lequel ils sont insérés dans un dictionnaire.

OrderedDictionary – les valeurs sont accessibles via un index entier (par ordre dans lequel les éléments ont été ajoutés) SortedDictionary – les éléments sont automatiquement sortingés

Dictionary est plus rapide que la hashtable car le dictionnaire est un type fort générique. Hashtable est plus lent car il prend un object comme type de données, ce qui conduit à la boxe et à la désencapsulation.