Che cosa è più conveniente: Traversal utilizzando n iteratori di un singolo o ConcurrentHashMap n istanze di un HashMap
-
12-10-2019 - |
Domanda
Immaginate uno scenario produttore-consumatore, infilare un produce voci, uno a molti altri thread li consumi.
Per questo sto passando un sacco di voci a ogni thread consumatore.
Do fare questo sto chiedendo se è più conveniente (primario nel senso di cpu utlization, secondaria in memoria):
- per fornire ogni consumatore filo un'istanza separata di un
HashMap
. Dopo aver superato ilMap
di un consumatore, una nuova istanza dellaMap
viene creato e utilizzato per passare le voci accanto prodotte all'altro filo
o
- di utilizzare un unico
ConcurrentHashMap
e crea unIterator
per ogni filettature dei consumatori e dopo aver superato ilIterator
alla filettatura compensazione delMap
-. Modo che ogni Iterator contiene una propria vista del sottostanteMap
Cosa ne pensi? È una risposta più o meno generico possibile?
O è fortemente dipendente di alcune variabili come il numero di voci, discussioni, ecc?
EDIT:? o dovrei usare qualche altro tipo di struttura dati che possono meglio risolvere questi tipi di problemi
Soluzione
Il pacchetto concomitante java fornisce una struttura di dati per questo scenario esatto.
@see java.util.concurrent.BlockingDeque
Ma per favore fare qualche prova di perfomance: perché i risultati dipendono stongly sul caso si utilizza. E se si tratta solo di micro ottimizzazione, di una:. Pulito, facile da capire, filo Salva approccio sarebbe molto meglio di quanto l'ottimizzazione delle prestazioni del whithout impatto
Altri suggerimenti
La cosa più costosa cpu-saggio è discussioni contesa. Sembra, il vostro primo approccio produrrà alcun conflitto a tutti - ogni thread avrà è la versione locale del Map -. A spese del consumo di memoria più elevato
Mi piacerebbe, per esempio, punto di riferimento due scenari per diverse configurazioni (n ° di fili, dimensioni di carta, ecc), che ha senso. E 'difficile dire le cifre esatte, senza punto di riferimento.