. NET HashTable Vs Dictionary - czy Słownik może być tak szybki?

Staram się dowiedzieć, kiedy i dlaczego używać słownika lub HashTable. Zrobiłem trochę Wyszukiwania na tutaj i znalazłem ludzi mówiących o ogólnych zalet słownika, z którym całkowicie się Zgadzam, co prowadzi do boksu i unboxing korzyści dla niewielkiego wzrostu wydajności.

Ale przeczytałem również słownik nie zawsze zwróci obiekty w kolejności, w jakiej są wstawiane, rzecz jest posortowana. Gdzie jako HashTable Wola. Jak rozumiem prowadzi to aby HashTable był znacznie szybszy w niektórych sytuacjach.

Moje pytanie brzmi naprawdę, jakie mogą być te sytuacje? Czy mylę się w moich założeniach powyżej? Jakich sytuacji można użyć, aby wybrać jedną nad drugą, (tak, ostatnia jest nieco niejednoznaczna).

Author: John Saunders, 2009-07-07

9 answers

System.Collections.Generic.Dictionary<TKey, TValue> zarówno klasy System.Collections.Hashtable, jak i klasy System.Collections.Hashtable zachowują wewnętrznie strukturę danych tabeli hash. Żadna z nich nie gwarantuje zachowania kolejności przedmiotów.

Pomijając kwestie boksu/unboxingu, w większości przypadków powinny one mieć bardzo podobną wydajność.

Podstawowa różnica strukturalna między nimi jest taka, że Dictionary polega na łańcuchowaniu (utrzymywaniu listy elementów dla każdego wiadra tabeli skrótów) w celu rozwiązywania kolizji, podczas gdy Hashtable używa ponownie do kolizji rozdzielczość (gdy dojdzie do kolizji, próbuje innej funkcji skrótu, aby zmapować klucz do wiadra).

Jest niewiele korzyści, aby używać klasy Hashtable, jeśli kierujesz do. NET Framework 2.0+. Jest faktycznie przestarzały przez Dictionary<TKey, TValue>.

 280
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-07 20:33:52

To chyba nic dla Ciebie nie znaczy. Ale tylko dla odniesienia dla osób zatrzymujących się

Test wydajności-SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable

 103
Author: Abdul Munim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-16 21:07:28

Inną ważną różnicą jest to, że typ Hashtable obsługuje blokowanie wielu czytników i jednego pisarza w tym samym czasie, podczas gdy Słownik nie.

 23
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-14 16:45:53

Różnice między Hashtable a Dictionary

Słownik:

  • Słownik zwraca błąd, jeśli spróbujemy znaleźć klucz, który nie istnieje.
  • Słownik szybszy niż Hashtable, ponieważ nie ma boksu i unboxingu.
  • Słownik jest typem generycznym, co oznacza, że możemy go używać z dowolnym typem danych.

Hashtable:

  • Hashtable zwraca null, jeśli spróbujemy znaleźć klucz, który nie istnieje.
  • Hashtable słownik ponieważ wymaga boksu i unboxingu.
  • Hashtable nie jest typem generycznym,
 23
Author: user2771704,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-06 12:21:43

Artykuł MSDN: "klasa Dictionary<TKey, TValue> ma takie same funkcjonalność jako klasa Hashtable. A Dictionary<TKey, TValue> określonego typu (innego niż Object) ma lepsze osiągi niż Hashtable dla typów wartości, ponieważ elementy {[1] } są typ Object i dlatego boks i unboxing zazwyczaj występują, jeśli przechowywanie lub pobieranie typu wartości".

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

 15
Author: Juan Camilo Caro J.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-03 12:56:16

Obie są faktycznie tą samą klasą(możesz spojrzeć na demontaż). HashTable został stworzony pierwszy przed. Net miał generics. Słownik jest jednak klasą ogólną i daje silne korzyści w pisaniu. Nigdy nie użyłbym HashTable, ponieważ Słownik nic cię nie kosztuje.

 11
Author: Adam Luter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 20:50:43

Kolejną ważną różnicą jest to, że Hashtable jest bezpieczny dla wątku. Hashtable posiada wbudowane zabezpieczenie wątku multiple reader/single writer (MR/SW), co oznacza, że Hashtable umożliwia jeden writer wraz z wieloma czytnikami bez blokowania. W przypadku Dictionary nie ma zabezpieczenia wątku, jeśli potrzebujesz bezpieczeństwa wątku, musisz zaimplementować własną synchronizację.

Do dalszego rozwinięcia:

Hashtable, zapewnij bezpieczeństwo wątku poprzez właściwość Synchronized, która zwraca owijarkę bezpieczną dla wątku wokół kolekcji. Owijarka działa poprzez zablokowanie całej kolekcji przy każdej operacji dodawania lub usuwania. Dlatego każdy wątek, który próbuje uzyskać dostęp do kolekcji, musi czekać na swoją kolej, aby wziąć jedną blokadę. Nie jest to skalowalne i może spowodować znaczny spadek wydajności dla dużych kolekcji. Ponadto konstrukcja nie jest całkowicie chroniona przed warunkami wyścigowymi.

Klasy kolekcji. NET Framework 2.0 jak List<T>, Dictionary<TKey, TValue>, itp. nie podawaj żadnego wątku synchronizacja; kod użytkownika musi zapewniać całą synchronizację, gdy elementy są dodawane lub usuwane w wielu wątkach jednocześnie Jeśli potrzebujesz bezpieczeństwa typu, a także bezpieczeństwa wątku, użyj klas współbieżnych kolekcji w. NET Framework. Czytaj dalej tutaj.

 6
Author: NullReference,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-12 15:11:32

Jeśli zależy ci na czytaniu, które zawsze zwróci obiekty w kolejności, w jakiej zostały wstawione do słownika, możesz zajrzeć do

OrderedDictionary - dostęp do wartości można uzyskać za pomocą indeksu integer (według kolejności, w jakiej pozycje zostały dodane) SortedDictionary - pozycje są automatycznie sortowane

 1
Author: ToXinE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 08:01:42

Słownik jest szybszy niż hashtable, ponieważ słownik jest generycznym silnym typem. Hashtable jest wolniejszy, ponieważ przyjmuje obiekt jako typ danych, co prowadzi do boksowania i rozpakowywania.

 -1
Author: jitendra mahaapatro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-15 06:24:40