4 Stimmen

Was ist billiger: Traversieren mit n Iteratoren einer einzelnen ConcurrentHashMap oder n Instanzen eines HashMap

Stellen Sie sich ein Produzenten-Verbraucher-Szenario vor, Thread A erzeugt Einträge, die von vielen anderen Threads konsumiert werden.

Dafür übergebe ich ein Bündel von Einträgen an jeden Verbraucherthread.

Um dies zu tun, frage ich mich, ob es günstiger ist (hauptsächlich im Hinblick auf die CPU-Auslastung, sekundär im Speicher):

  • jedem Verbraucherthread eine separate Instanz einer HashMap zur Verfügung zu stellen. Nachdem die Map an einen Verbraucher übergeben wurde, wird eine neue Instanz der Map erstellt und für das Weitergeben der nächsten erzeugten Einträge an den nächsten Thread verwendet

oder

  • ein einzelnes ConcurrentHashMap zu verwenden und für jeden Verbraucherthread einen Iterator zu erstellen und nachdem der Iterator an den Thread übergeben wurde, die Map zu löschen - so dass jeder Iterator seine eigene Ansicht der zugrunde liegenden Map enthält.

Was denkst du? Ist eine mehr oder weniger generische Antwort möglich?
Oder hängt es stark von einigen Variablen wie Anzahl der Einträge, Threads usw. ab?
BEARBEITEN: Oder sollte ich eine andere Art von Datenstruktur verwenden, die diese Art von Problemen besser lösen kann?

5voto

Ralph Punkte 114913

Das Java-Concurrent-Paket bietet eine Datenstruktur für genau dieses Szenario.

@see java.util.concurrent.BlockingDeque

Aber bitte führen Sie einige Leistungstests durch: Denn die Ergebnisse hängen stark von Ihrem Anwendungsfall ab. Und wenn dies nur eine Mikro-Optimierung ist, dann wäre ein sauberer, leicht verständlicher, threadsicherer Ansatz viel besser als Leistungsoptimierungen ohne Auswirkungen.

0voto

Victor Sorokin Punkte 11645

Das teuerste in Bezug auf die CPU sind Thread-Konflikte. Offenbar wird Ihr erster Ansatz überhaupt keine Konflikte verursachen - jeder Thread wird seine lokale Version der Map haben - auf Kosten eines höheren Speicherverbrauchs.
Ich würde zum Beispiel zwei Szenarien für verschiedene Setups benchmarken (Anzahl der Threads, Größen der Map, etc.), die sinnvoll sind. Ohne Benchmark ist es schwer genaue Zahlen zu nennen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X