.NET HashTable Vs Dictionary – Il dizionario può essere altrettanto veloce?

Sto cercando di capire quando e perché usare un dizionario o una HashTable. Ho fatto un po ‘di ricerca qui e ho trovato persone che parlano dei vantaggi generici del dizionario che sono totalmente d’accordo, che porta il vantaggio di boxe e unboxing per un leggero guadagno in termini di prestazioni.

Ma ho anche letto il dizionario non restituirà sempre gli oggetti nell’ordine in cui sono inseriti, cosa è ordinata. Dove sarà come un HashTable. Da quello che ho capito, questo porta l’HashTable ad essere molto più veloce in alcune situazioni.

La mia domanda è davvero, quali potrebbero essere queste situazioni? Ho sbagliato solo nelle mie ipotesi sopra? Quali situazioni potresti usare per sceglierne una sopra l’altra, (sì l’ultima è un po ‘ambigua).

System.Collections.Generic.Dictionary classi System.Collections.Generic.Dictionary e System.Collections.Hashtable mantengono internamente una struttura di dati della tabella hash. Nessuno di questi garantisce la conservazione dell’ordine degli articoli.

Lasciando da parte i problemi di boxe / unboxing, la maggior parte delle volte, dovrebbero avere prestazioni molto simili.

La differenza strutturale principale tra loro è che il Dictionary si basa sul concatenamento (mantenendo un elenco di elementi per ogni hash table bucket) per risolvere le collisioni mentre Hashtable usa il rehashing per la risoluzione delle collisioni (quando si verifica una collisione, prova un’altra funzione hash per mappare la chiave a un secchio).

C’è poco vantaggio nell’usare la class di Hashtable se si utilizza il .NET Framework 2.0+. È effettivamente reso obsoleto dal Dictionary .

Immagino che non significhi niente per te ora. Ma solo per riferimento per le persone che si fermano

Test delle prestazioni – SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

Un’altra importante differenza è che il tipo Hashtable supporta contemporaneamente più lettori bloccabili e un singolo writer, mentre Dictionary no.

Differenze tra Hashtable e Dizionario

Dizionario:

  • Il dizionario restituisce un errore se proviamo a trovare una chiave che non esiste.
  • Dizionario più veloce di un Hashtable perché non esiste boxe e unboxing.
  • Il dizionario è un tipo generico che significa che possiamo usarlo con qualsiasi tipo di dati.

hashtable:

  • Hashtable restituisce null se proviamo a trovare una chiave che non esiste.
  • Hashtable più lento del dizionario perché richiede il pugilato e l’unboxing.
  • Hashtable non è un tipo generico,

Articolo MSDN: “La class Dictionary ha le stesse funzionalità della class Hashtable . Un Dictionary di un tipo specifico (diverso da Object ) ha prestazioni migliori rispetto a un Hashtable per i tipi di valore perché gli elementi di Hashtable sono di tipo Object e, di conseguenza, il pugilato e l’unboxing si verificano in genere se si memorizza o si recupera un tipo di valore “.

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

Entrambi sono effettivamente la stessa class (puoi guardare allo sassembly). HashTable è stato creato prima. Net aveva generici. Il dizionario, tuttavia, è una class generica e offre notevoli vantaggi di digitazione. Non userei mai HashTable dato che il dizionario non ti costa nulla da usare.

Un’altra importante differenza è che Hashtable è thread-safe. Hashtable ha integrato la sicurezza del thread reader / single writer (MR / SW), il che significa che Hashtable consente a UNO writer insieme a più lettori senza bloccare. Nel caso del Dictionary non c’è la sicurezza del thread, se hai bisogno di sicurezza del thread devi implementare la tua sincronizzazione.

Per approfondire:

Hashtable , fornisce alcuni thread-sicurezza attraverso la proprietà Synchronized, che restituisce un wrapper thread-safe attorno alla collezione. Il wrapper funziona bloccando l’intera raccolta su ogni operazione di aggiunta o rimozione. Pertanto, ogni thread che sta tentando di accedere alla raccolta deve attendere il proprio turno per prendere l’unico blocco. Questo non è scalabile e può causare un degrado significativo delle prestazioni per le raccolte di grandi dimensioni. Inoltre, il design non è completamente protetto dalle condizioni della gara.

Le classi di raccolta di .NET Framework 2.0 come List , Dictionary , ecc. Non forniscono alcuna sincronizzazione dei thread; il codice utente deve fornire tutte le sincronizzazioni quando gli articoli vengono aggiunti o rimossi contemporaneamente su più thread Se è necessario sicurezza dei tipi e sicurezza dei thread, utilizzare le classi di raccolte simultanee in .NET Framework. Ulteriore lettura qui.

Se ti interessa leggere che restituirà sempre gli oggetti nell’ordine in cui sono inseriti in un dizionario, puoi dare un’occhiata a

OrderedDictionary – i valori sono accessibili tramite un indice intero (dall’ordine in cui sono stati aggiunti gli articoli) SortedDictionary – gli elementi sono ordinati automaticamente

Il dizionario è più veloce di hashtable poiché il dizionario è un tipo forte generico. Hashtable è più lento in quanto prende l’object come tipo di dati che conduce al pugilato e all’unboxing.