2013-01-01 12 views
10

Devo implementare un algoritmo standard a un unico produttore. Posso implementarlo usando Queue e un paio di dichiarazioni lock facilmente. O posso semplicemente usare ConcurrentQueue. Cos'è meglio?prestazioni di ConcurrentQueue vs Queue + lock

Se si utilizza Queue + lock, è possibile ottimizzare "aggiunta/retreival multiple", poiché è possibile effettuare il comando lock una volta e quindi Add molte volte.

Che cosa è più veloce nel caso generale - ConcurrentQueue o Queue + lock e quanto è la differenza? Ovviamente lo ConcurrentQueue è il modo più veloce per andare avanti, ma non voglio perdere un sacco di prestazioni mentre sto usando questo nell'applicazione di trading HFT.

+0

Innanzitutto, la prestazione è correlata al numero di CPU. È difficile valutare le prestazioni dell'applicazione multithreading in alcune modalità astratte. – user1929959

+7

Che dire della misurazione nel proprio ambiente? Posso darti dei numeri che dimostrano tutto quello che vuoi sulla mia macchina. –

risposta

19

Da C# in a Nutshell:

Lo stack concorrente, le classi della coda, e la borsa sono implementate internamente con liste collegate. Ciò li rende meno efficienti in termini di memoria rispetto alle classi non simultanee Stack e Queue, ma migliori per l'accesso simultaneo perché gli elenchi concatenati sono conduttivi per le implementazioni di lock-free o con blocco basso.

In altre parole, è difficile definire un caso generale, per non parlare di prevedere quale sarà la differenza di prestazioni.

Dipende dalle dimensioni della raccolta e dall'utilizzo. Ci si può aspettare che le prestazioni siano migliori con un accesso concorrente sufficiente, il consumo di memoria sarà peggiore.