Domanda

Mi chiedo circa i parametri per la costruzione di un ConcurrentHashMap:

  • initialCapacity è 16 per default (compreso).
  • loadFactor è di 0,75 per impostazione predefinita.
  • concurrencyLevel è 16 per impostazione predefinita.

Le mie domande sono:

  • Quali criteri deve essere utilizzato per regolare loadFactor alto o in basso?
  • Come si fa a stabilire il numero di concomitanza aggiornare le discussioni?
  • Quali criteri deve essere utilizzato per regolare concurrencyLevel alto o in basso?

In aggiunta:

  • Quali sono le caratteristiche di un bene implementazione codice hash? (Se un domanda SO indirizzi questo, basta collegare ad esso.)

Grazie!

È stato utile?

Soluzione

La risposta breve: impostare "capacità iniziale" a circa il numero di mappature che ci si aspetta di mettere nella mappa, e lasciare gli altri parametri al loro valore predefinito

.

Risposta lunga:

  • fattore di carico è il rapporto tra la numero di "secchi" nella mappa e il numero degli elementi previsti;

  • 0,75 è di solito un compromise-- ragionevole se ben ricordo, vuol dire che con un buona funzione di hash, in poi media si aspettano circa 1,6 reindirizza a trovare una elemento nella mappa (o intorno a quella figura);

    • cambiando il carico fattore cambia il compromesso tra più reindirizzamenti per trovare un elemento, ma meno sprecato space-- mettere 0.75 è davvero di solito un buon valore;

    • In linea di principio, insieme a ConcurrencyLevel il numero di thread simultanei si aspettano di avere la modifica della mappa, anche se questo non lo fa sopravvalutare sembrano avere un effetto negativo altra che sprecare memoria (ho scritto un po ' ConcurrentHashMap prestazioni qualche tempo fa nel caso in cui siete interessati)

Informalmente, la funzione di hash deve mirare essenzialmente ad avere il più "casualità" nei bit possibile. O, più strettamente, il codice hash per un dato elemento dovrebbe dare ogni bit una possibilità circa il 50% di essere impostato. In realtà è più facile per illustrare con un esempio: ancora una volta, si può essere interessati in alcune cose che ho scritto su come la funzione di hash String funziona e le linee guida funzione di hash associata . Il feedback è benvenuto obvioulsy su nessuna di queste cose.

Una cosa ho detto anche ad un certo punto è che non c'è bisogno di essere troppo paranoici in pratica: se la funzione di hash produce una quantità "ragionevole" di casualità in alcuni dei bit, allora sarà spesso OK. Nel peggiore dei casi, attaccando pezzi rappresentativi di dati in una stringa e prendendo il codice hash della stringa in realtà non funziona così male.

Altri suggerimenti

Fattore di carico è principalmente correlato alla qualità della funzione di hash. Il più vicino a zero il fattore di carico meno probabilità ci sono di essere collisioni, anche se la funzione di hash non è così grande. Il fuori commercio è che l'occupazione di memoria è più grande. In altre parole, il HashMap non distribuisce le voci in secchi separati per ogni hashcode individuale, li raggruppa secondo una prossimità, quindi più secchi che ha, più disteso la distribuzione, la meno probabile che ci sono collisioni.

Così la linea di fondo è che giocherellare con fattore di carico per migliorare i tempi di ricerca o ridurre la memoria, in base alle vostre esigenze e gli oggetti si archiviano nella mappa.

ConcurrencyLevel in realtà dipende la vostra applicazione. Se avete solo due o tre thread in esecuzione l'applicazione, ci si va. Se sei un application server con un numero arbitrario di thread, allora avete bisogno di capire che cosa il vostro capacità di carico è e che punto si desidera ottimizzare per.

Una buona implementazione hashcode qualità offre la più ampia distribuzione su valori potenziali dell'oggetto più possibile con il minor numero di collisioni, mentre onorare il contratto. In altre parole, permette la HashMap (o Imposta a seconda dei casi può essere) per distribuire gli oggetti in secchi separati rendendo le ricerche più veloci.

loadFactor: controlli quando l'implementazione decide di ridimensionare la tabella hash. Un valore troppo alto sprecherà spazio; un valore troppo basso si tradurrà in operazioni di ridimensionamento costose.

concurrencyLevel: dice l'implementazione per cercare di ottimizzare per il dato numero di thread di scrittura. Secondo la documentazione API, essendo fuori fino ad un fattore di 10 non dovrebbe avere molto effetto sulle prestazioni.

  

La concorrenza consentito fra aggiornamento   operazioni è guidato dal opzionale   argomento del costruttore concurrencyLevel   (Default 16), che è usato come un suggerimento   per collatura. Il tavolo è   internamente partizionato per cercare di   permettere al numero indicato di   aggiornamenti simultanei senza contesa.   Poiché il posizionamento nelle tabelle hash è   essenzialmente casuale, l'attuale   concorrenza varierà. Idealmente, si   dovrebbe scegliere un valore per accogliere   come molti thread come sarà mai   contemporaneamente modificare la tabella. Usare un   valore significativamente più alto di quanto si   bisogno può sprecare spazio e nel tempo, e un   significativamente valore più basso può portare a   contesa thread. ma sovrastima   e sottostima in un ordine di   grandezza di solito non hanno molto   notevole impatto.

Una buona implementazione hashcode distribuirà i valori hash uniformemente su qualsiasi intervallo. Se il set di chiavi è nota in anticipo, è possibile definire una funzione di hash "perfetta" che crea un valore hash univoco per ogni tasto.

  

loadFactor è impostato su 0,75 per impostazione predefinita,   quali criteri dovrebbero essere utilizzati per regolare   questo in su o in giù?

E 'necessario un po' di esperienza in modo hash lavoro mappe prima di poter capire come funziona. La mappa è essenzialmente una serie di secchi. Ogni valore nella mappa viene messo in un secchio a seconda di ciò che il suo codice hash è. Il loadFactor significa che, se i secchi sono pieni oltre il 75%, la mappa dovrebbe essere ridimensionato

  

concurrencyLevel è impostato su 16 da   di default, come facciamo a stabilire la   numero di aggiornare simultaneamente   discussioni? Quali criteri dovrebbero essere usati   per regolare questo in su o in giù?

Si tratta di chiedersi come molti fili a che ci si aspetta di modificare la mappa contemporaneamente (contemporaneamente)

Per i codici hash, vedere di Joshua Bloch Effective Java

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top