Hashtable vs HashMap Leistung in single-threaded-app
Ich weiß, dass Hashtable synchronisiert, so ist es sicher benutzt werden im Multi-Thread-app und HashMap nicht.
Frage ich mich, ob es irgendwelche performance-Unterschied zwischen diesen beiden in einem einzigen thread app.
(Oder, bei der Verwendung einer über den anderen?)
- Sie sprechen eine bestimmte Sprache/Bibliothek? Wenn ja, welche?
- Hashtable ist nicht inhärent sicher ist, zu verwenden mit mutlithreaded Zugang -- nur die Methoden, die synchronisiert sind; es nicht implizit erstellen, die alle größeren atomaren Konstrukte, die erforderlich sein können. Überlegen Sie auch, Sammlungen.synchronizedMap zu bekommen Hashtable-wie Semantik aus einer HashMap.
- Es ist tagged as Java (kann es nicht gewesen sein, wenn Sie danach gefragt werden).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, eine thread-sichere collection können Sie ConcurrentHashMap oder Sammlungen.synchronizedMap() mit LinkedHashMap oder HashMap. Wenn Sie nicht brauchen eine thread-sichere collection können Sie nur die letzten beiden. Hashtable wurde retro ausgestattet, zur Unterstützung von Anzeigen, die mit generics, aber es kommt auch mit einer Menge von legacy-Methoden, die das gleiche tun oder viel die gleiche Sache.
Hashtable kann verwendet werden, allerdings IMHO mit einer der vielen anderen Optionen, die entwickelt wurden, später wäre eine sauberere Lösung. Wenn Sie eine Bibliothek haben, die eine Hashtable, dann müssen Sie es verwenden, aber sonst würde ich eine Klasse verwenden die das tut, was Sie brauchen, folgt am besten Praxis, mit einem minimum von legacy-Methoden.
Den Unterschied in der Leistung dürfte ungefähr 0.5 us pro Anruf. Dies kann oder kann nicht signifikant sein.
Jedoch, wenn Sie nicht brauchen, ein Typ zu sein, thread-sicher, es gibt keinen guten Grund für die Verwendung synchronisierten Fassung. Wenn Sie brauchen, ein Typ zu sein, thread-sicher, die Sie nicht verwenden können, eine Art, die nicht ohne einige thread-Sicherheit guard.
Hashtable
wurde nachgerüstet mit Generika und entsprichtMap<K,V>
- wie ist es (aktuell) legacy dann?Nehmen, was @svick erwähnt in dem Kommentar. Wenn Sie sprechen über die
Hashtable
undHashMap
enthalten, die mit dem Java SDK, es ist definitiv ein performance-Unterschied, wieHashMap
Sie nicht diesynchronized
Blöcke, die einen overhead.Gemäß pst der Wunsch ist hier etwas zu Lesen über synchronisierte performance und hier ist etwas ein bisschen neueres, in Bezug auf Java 1.4 vs Java 6 auf einer Maschine.
Seit Java 7 behauptet, dass es tun können, escape-Analyse, und entfernen Sie uncontended synchronisieren in einigen Fällen, ich gab es einen test
Ich kann nicht denken, der ein einfacheres Beispiel für die escape-Analyse. Aber offensichtlich Java 7 nicht optimieren Sie die Synchronisierung deaktivieren, in meiner test; jeder
synchronized (o){}
verbrauchen einige Zeit.Erstaunlich, es verbraucht nur etwa 1 CPU-Zyklus, die zu schnell zu glauben. Es sollte enthalten mindestens zwei compare-and-set-Instruktionen; der Zugriff auf L1-cache dauert in der Regel 10 Zyklen. Anscheinend gibt es einige hardware-Optimierung treten.
Dies ist eine enge Schleife, nicht der realen Anwendung. Es ist auch schwer zu diskutieren, echte apps im Allgemeinen; schwer zu analysieren, selbst für eine konkrete Anwendung. Dann sollten wir wahrscheinlich lieber HashMap, wenn möglich, die zumindest nicht langsamer sein als Hashtable in jedem Fall, soweit wir wissen.
o
ist für andere Nutzer nicht sichtbar, sosynchronized(o)
hat keine Wirkung, bevor Sie es entfernen können Sie die Anweisung.Unterschiede
(Es kann aber immer noch verwendet werden, für die Multithread-liest, wenn es nicht modifiziert, f.e. - initialisieren Sie einmal auf start und nur Lesen für einige statische caches)
Leistung
Hier sind einige der single-thread-tests zu vergleichen. 5 versucht von 100 mill ops (1. Versuch kann als warm-up) stellen, ist 100% Kollisionen, zu bekommen ist 50% trifft.
HashMap ist in der Regel schneller. Seine bekommen ist 2x schneller als Hashtable. Jedoch, seine setzen ist 25% langsamer.
Hashtable, wenn keine null-Werte erforderlich sind, oder Sammlungen.synchronizedMap(new HashMap<> ()), wenn null-Werte erforderlich sind. Beachten Sie, dass Synchronisierte HashMap ist langsamer als Hashtable (schlägt 2x langsamer, bekommt 50% langsamer)
Den code für den test verwendet als JUnit:
Ja. Das ist die (eine der) die Punkte der HashMap nicht synchronisiert standardmäßig (verwenden Sie synchronizedMap (), damit es synchronisiert, obwohl beachten Sie, dass je nach Nutzung, nur einfache Synchronisierung möglicherweise nicht ausreichen, um die Integrität über alle Vorgänge, möchten Sie vielleicht zu tun).
Ich würde erstaunt sein, wenn Sie könnte sogar Messen, einen Unterschied in der realen Welt zu testen. Wenn Sie Messen zig Operationen, vielleicht, aber Sie werden nicht das tun, Myriaden, Sie werden hart gedrückt, um zu erreichen, sogar die erste million.
Wenn keine Nummern auf Hashtable vs. HashMap, aber vor einigen Jahren Ich verglich Vektor mit ArrayList, wo es ein ähnliches Problem.