Antonio Esposito's


Prodotti tipici .NETtiani

Parallel.For, Parallel.ForEach

Ciao

Il .NET 4.0 ad oggi in RC1 offre molte novità, una delle più importanti per quanto riguarda le prestazioni è il Parallel Patterns Library. Usando in nuovi namespaces e le nuove classi è possibile a codice usare un costrutto sequenziale che viene poi convertito ed eseguito a runtime su più thread del threadpool. Questo sistema non ci facilita l'elaborazione asincrona su altri thread, ma diciamo che velocizza l'esecuzione di alcuni costrutti. E' ovvio che un For parallelo non è più veloce di uno sequenziale se lo utilizziamo per addizionare una variabile... mentre se nel ciclo usiamo molto tempo CPU, tipo comprimiamo molti files, crittiamo molti dati, processiamo molti XML, etc, allora il guadagno in termini di tempo è molto maggiore.

Un esempio:
il classico for sequenziale
for (int i=0; i<10; i++) { faccio qualcosa }
diventerebbe con l'aiuto della classe System.Threading.Task.Parallel.For(0,10,i => { faccio qualcosa });

Analizzando quanto scritto capiremo che: la nuova classe splitta l'esecuzione su più thread, utilizzando dei vettori sincronizzati nascosti in cui poi rigenera la sequenza iniziale. Al programmatore costa solo scrivere meno codice di quanto normalmente fatto con il for, e mettere il codice interno in una piccola lambda. Il compilatore farà il resto. Unica particolarità sta nel fatto che il breack; farebbe comportare il Parallel.For ugualmente al for normale (ferma l'esecuzione) ma in un contesto multithreading significa più precisamente: ferma l'esecuzione a questo elemento, completanto l'esecuzione degli elementi precedenti anche se ancora in esecuzione su altri thread.

Un semplice foreach:
foreach (var c in mycollection) { faccio qualcosa }
diventerebbe: Parallel.ForEach(mycollection, c => {faccio qualcosa });

 

MSDN: http://msdn.microsoft.com/en-us/library/dd537608(VS.100).aspx

Categoria: Tips
martedì, 02 mar 2010 Ore. 09.55
Statistiche
  • Views Home Page: 10.819
  • Views Posts: 59.081
  • Views Gallerie: 0
  • n° Posts: 44
  • n° Commenti: 16
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003