2010-05-13 13 views
7

Sono curioso delle caratteristiche delle prestazioni di Parallel.ForEach. Dato un qualsiasi costrutto valido all'interno di un ciclo Parallel.ForEach, è sempre preferibile usare Parallel.ForEach su un ciclo foreach? Mi sto chiedendo in particolare il sovraccarico di invocare la libreria Attività parallele su insiemi di piccole dimensioni o altri casi limite in cui un ciclo foreach potrebbe essere più veloce. So che la libreria è abbastanza intelligente su quando/come generare i thread ... ci sono casi in cui è meglio lasciare il codice in un ciclo foreach, o è il sovraccarico per chiamare i task paralleli generalmente trascurabili, quindi se puoi, dovresti utilizzare Parallel.ForEach?Quali sono le linee guida per Parallel.ForEach vs. foreach?

Questa domanda è simile e fornisce buone informazioni sulle differenze funzionali, ma in realtà non parla con le prestazioni. Si noti che sto ignorando la compatibilità di NET < 4 come una ragione per stare con un foreach:

C#: Any benefit of List<T>.ForEach(...) over plain foreach loop?

+1

Si potrebbe trovare alcune risposte qui http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

risposta

8

Non è sempre preferibile. Per i corpi a ciclo veloce, Parallel.ForEach può ridurre le prestazioni. Una delle linee guida elencate in Parallel Programming Coding Guidelines è misura sia prima che dopo la parallelizzazione.

Altri articoli utili sono stati pubblicati dallo parallel computing group.

+0

Capisco e sono d'accordo con misurazione delle prestazioni, ma è bello avere una linea guida generale per iniziare (come il tuo commento sui corpi ad anello veloce). Il link per i download di @Daniel Straight ha anche delle buone cose generali. http://www.microsoft.com/downloads/details.aspx?familyid=C3EA8FB5-650D-434B-A216-7E54C53965D1&displaylang=en –

+0

+1 per il riferimento alle Linee guida per la programmazione parallela. – Steven

2

Direi di attenersi sempre a semplici (ad es. Foreach regolari) e implementare solo cose più complesse (ad esempio Parallel ForEach) quando si ha un requisito misurabile per farlo. Quindi, se puoi provare che in una particolare istanza la normale foreach non è veloce come hai bisogno, e puoi provare per quella particolare istanza che il Parallel foreach risolverà il tuo problema, allora usa il Parallelo.

Altrimenti basta che sia semplice.

+3

Non sono d'accordo con questo, "il più velocemente possibile" non è lo stesso "veloce quanto l'utente vorrebbe". Dovremmo esaminare più spesso le cose pallettizzate quando aumenta il numero medio di core. –

Problemi correlati