2015-05-07 15 views
9

Sto utilizzando un dizionario concorrente per archiviare circa due milioni di record e voglio sapere su cosa inizializzare il livello di concorrenza del mio dizionario.come scegliere il livello di concorrenza di un dizionario simultaneo

pagina MSDN ha il seguente commento nel suo codice esempio:

Maggiore è il concurrencyLevel, maggiore è il numero teorico di operazioni che possono essere eseguite contemporaneamente sullo ConcurrentDictionary. Tuttavia, le operazioni globali come ridimensionare il dizionario richiedono più tempo con l'aumentare del livello di concorrenza.

Questo è il meglio che ho potuto trovare che spieghi cosa significa ConcurrencyLevel e tuttavia è ancora molto vago.

risposta

10

La cosa più importante da capire è che, anche se si dispone di più accessi simultanei rispetto allo concurrencyLevel, le operazioni saranno ancora thread-safe. Cioè, l'impostazione di concurrencyLevel è una questione di prestazioni, non di correttezza.

concurrencyLevel specifica il numero di blocchi indipendenti disponibili per le operazioni della mappa. Se hai n thread che accedono contemporaneamente al dizionario, l'impostazione di concurrencyLevel superiore a n non produrrà alcun vantaggio aggiuntivo. In generale, il valore ottimale per concurrencyLevel sarà significativamente inferiore rispetto al numero di thread di lavoro, tuttavia, poiché un determinato dipendente non impiegherà la maggior parte del tempo per accedere al dizionario.

Il profilo dell'applicazione è davvero l'unico modo per determinare l'concurrencyLevel ottimale. Tuttavia, impostarlo sul numero previsto di thread di lavoro è un buon inizio.

+0

Accetto sulla parte di profilazione. È davvero l'unico modo per dirlo. –

+0

Puoi spiegare quali strumenti potresti utilizzare per creare un profilo (ad esempio VS Concurrency Visualizer). Inoltre, in particolare, cosa sto cercando durante la profilatura che mi indica che dovrei aumentare/cambiare il livello di concorrenza? –

Problemi correlati