Was ist billiger: Traversal mit n Iteratoren eines einzelnen ConcurrentHashMap oder n Instanzen einer HashMap
-
12-10-2019 - |
Frage
Stellen Sie sich ein Erzeuger-Verbraucher-Szenario, Gewinde A erzeugt Einträge, einer zu vielen anderen Threads verbrauchen sie.
Für das ich ein paar Einträge zu jedem Verbraucher Thread vorbei.
Tu das frage ich mich, ob es billiger ist (primär in Richtung der CPU utlization, sekundären Speicher):
- jeder Verbraucher, um eine separate Instanz eines
HashMap
fädeln. denMap
einen Verbraucher, eine neue Instanz derMap
Nach dem Passieren wird zum Durchlassen der nächsten erzeugten Einträge in den nächsten Thread erstellt und verwendete
oder
- eine einzige
ConcurrentHashMap
zu verwenden und eineIterator
für jeden Verbraucher Threads erstellen und nach derIterator
zum Fadendurchleiten derMap
Clearing -., So dass jeder Iterator enthält seine eigene Ansicht des zugrundeliegendenMap
Was denken Sie? Ist ein mehr oder weniger generische Antwort möglich?
Oder ist es stark abhängig von einigen Variablen wie Anzahl der Einträge, Fäden usw.?
EDIT:? oder sollte ich eine andere Art von Datenstruktur verwenden, die besser, diese Art von Problemen lösen kann
Lösung
Das Java gleichzeitige Paket stellt eine Datenstruktur für genau dieses Szenario.
@see java.util.concurrent.BlockingDeque
Aber bitte etwas Perfomance-Test machen: weil die Ergebnisse hängen stongly auf Sie Fall verwenden. Und , wenn diese nur Mikro-Optimierung ist, als ein:. Sauber, leicht zu verstehen, würde Thread speichern Ansatz besser viel als Performance-Optimierung whithout Auswirkungen
Andere Tipps
Das teuerste, was CPU-weise ist Fäden Anstoß. Scheint, Ihr erster Ansatz keine Behauptung überhaupt produzieren - jeder Thread ist es von Karte lokale Version haben wird -. Auf Kosten der höheren Speicherverbrauch
Ich würde zum einem Benchmark zwei Szenarien für verschiedene Setups (nr von Threads, Größen Karte, usw.) des Sinn. Es ist schwer, genaue Zahlen ohne Benchmark zu erzählen.