Oggi vi proponiamo una semplice console application che vi permetterà di testare rapidamente la libreria Parallel Linq (documentazione). Ovviamente scalfiremo solo la superficie delle potenzialità di Parallel Linq e sicuramente per utilizzarlo in un ambiente di produzione saranno necessarie attente riflessioni sull'effettiva utilità dipendente molto dalla potenza di calcolo del pc che ospiterà il software e dalla query da effettuare.

Per utilizzare PLinq è necessario creare un progetto .NET con framework almeno 4, dopodiché basterà chiamare il metodo AsParallel() sulla "sorgente dati" della nostra query. Nell'esempio seguente abbiamo istanziato una lista di interi random ed effettuiamo una semplice query, sia nella versione Linq classica che in PLinq.
Per enumerarle effettuiamo una foreach vuota su entrambe e misuriamo il tempo di esecuzione con la classe StopWatch di System.Diagnostics
List<int> interi = new List<int>();
Random rand = new Random();
for (int i = 0; i < 40000000; i++)
{
    interi.Add(rand.Next());
}

// Definisco una query con "plinq" utilizzando il metodo AsParallel() sui lista
var pquery = from i in interi.AsParallel()
                where i % 2 == 0 && i % 5 == 0
                select i;
Stopwatch psw = new Stopwatch();
psw.Start();
// La foreach fa si che la query venga eseguita
foreach (var n in pquery) { }
psw.Stop();

Console.WriteLine("Query parallela " + psw.ElapsedMilliseconds);


// Definisco una query con linq come facciamo sempre
var query = from i in interi
            where i % 2 == 0 && i % 5 == 0
            select i;

Stopwatch sw = new Stopwatch();
sw.Start();
// La foreach fa si che la query venga eseguita
foreach (var n in query) { }
sw.Stop();
Console.WriteLine("Query non parallela " + sw.ElapsedMilliseconds);

 

Eseguendo il codice così com'è otteniamo una durata di circa 1.1 secondi per la query parallela e una durata di circa 2 seconda per la query classica. 
Anche se il tempo di esecuzione è quasi dimezzato si devono prendere questi risultati "con le pinze", vi invitiamo infatti a testare il codice voi stessi e a verificare che con liste più piccole di interi è più veloce la query classica.
Questo comportamento è da attribuire all'overhead generato dalla "preparazione" della query in parallelo.
Sicumente PLinq offre un modo semplice e immediato per parallelizzare il nostro codice ma è necessaria un'analisi e una valutazione preliminari per capirne l'effettiva efficacia!
comments powered by Disqus