2012-09-27 12 views
15

Ho un codice che sto attualmente ottimizzando per la concorrenza nelle architetture multicore. In una delle mie classi, ho trovato un ciclo nidificato foreach. Fondamentalmente il ciclo esterno scorre attraverso una serie di oggetti NetworkInterface. Il ciclo interno esegue iterazioni tramite gli indirizzi IP delle interfacce di rete.Nested Parallel.ForEach loop

Mi ha fatto pensare che fare nidificare i loop Parallel.ForEach è necessariamente una buona idea? Dopo aver letto questo articolo (Nested Parallel.ForEach Loops on the same list?) non sono ancora sicuro di cosa si debba applicare in termini di efficienza e design parallelo. Questo esempio richiede circa Parallel.Foreach istruzioni applicate a un elenco in cui entrambi i loop eseguono operazioni su tale elenco.

Nel mio esempio, i loop stanno facendo cose diverse, quindi, dovrebbero I:

  1. utilizzare i cicli nidificati Parallel.ForEach?
  2. Utente Parallelo. Per il ciclo principale e lasciare il ciclo interno così com'è?
+2

È possibile testare la soluzione utilizzando il cronometro? Allora saprai se ne vale la pena. – mike00

risposta

19

A Parallel.ForEach non esegue necessariamente in parallelo, è solo una richiesta di farlo se possibile. Pertanto, se l'ambiente di esecuzione non ha la potenza della CPU per eseguire i loop in parallelo, non lo farà.

Se le azioni sui loop non sono correlate (vale a dire, se sono separate e non si influenzano a vicenda), non vedo alcun problema nell'utilizzo di Parallel.ForEach sia su loop interni che esterni.

Dipende davvero dall'ambiente di esecuzione. È possibile eseguire test di temporizzazione se l'ambiente di test è abbastanza simile all'ambiente di produzione e quindi determinare cosa fare. In caso di dubbio, prova ;-)

Buona fortuna!

+0

Potrebbe non essere più in disaccordo. Sì, lo scheduler dietro Parallel.Foreach non può generare thread separati, ma si sta superando un sovraccarico molto più elevato di uno dei thread o di uno schedulatore senza disporre di dati scientifici per eseguirne il backup. –

+2

@MAfifi: Leggi di nuovo la mia risposta, per favore. –

+0

Risposta migliore;) –

3

La risposta sarà, dipende;

  1. Cosa stai facendo con l'indirizzo IP una volta che ce l'hai?
  2. Quanto dura ogni passaggio?

I thread non sono economici, richiedono tempo per creare e la memoria esiste. Se non stai facendo qualcosa di computazionalmente costoso con quegli indirizzi IP e utilizzi il tipo sbagliato di raccolta per l'accesso simultaneo, stai quasi certamente rallentando la tua applicazione.

Utilizzare StopWatch per rispondere a queste domande.

+2

I thread sono costosi da creare, ed è esattamente il motivo per cui 'Parallel.ForEach()' usa 'ThreadPool', quindi la creazione di nuovi thread molto probabilmente non sarà un problema. – svick