PLINQ

De la Wikipedia, enciclopedia liberă
Salt la: Navigare, căutare

PLINQ ( Parallel Language-Integrated Query) este reprezentarea paralelă a modelului LINQ. LINQ a fost intrdous in .NET Framework 3.5 si este un model unificat pentru realizarea de interogări pe o sursă de date de tipul System.Collections.IEnumerable sau System.Collections.Generic.IEnumerable<T>. O interogare PLINQ este în multe moduri asemănătoare cu una LINQ. Diferența esențială este ca PLINQ încearcă sa pună in valoare toate procesoarele sistemului. Realizează acest lucru prin împărțirea sursei de date in mai multe segmente și apoi executând interogarea pe fiecare segment, pe fire de execuție diferite, rulând în paralel pe mai multe procesoare. Prin executia paralela PLINQ poate imbunătații semnificant performanța codului. Pe de altă parte paralelismul introduce unele complexități, și nu toate interogarile rulează mai repede, in unele cazuri este încetinit procesul.

Când este folosit modul secvențial?[modificare | modificare sursă]

PLINQ va încerca intotdeauna sa execute o interogare cel puțin la fel de rapid ca și cum ar rula secvențial. Modelul caută anumite "forme" de interogari, nu se uita la cat de costisitoare sunt sau cat de mari sunt sursele de date. Mai exact caută operatori sau combinații de operatori care de obicei fac execuția mai lentă in modul paralel. Când gasește aceste combinații rulează in mod secvențial.

Cu toate acestea, după mai multe teste utilizatorul poate realiza că o interogare de acest fel poate rula mai repede in modul paralel. In aceste cazuri utilizatorul poate folosi metoda WithExecutionMode<TSource>.

static void ForceParallel()
{
    var customers = GetCustomers();
    var parallelQuery = (from cust in customers.AsParallel()
                            .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                         where cust.City == "Berlin" 
                         select cust.CustomerName)
                        .ToList();
}

Sintaxă[modificare | modificare sursă]

Diferenta intre o interogare simple LINQ și una PLINQ este folosirea metodei AsParalel pe sursa de date, și executarea interogării folosind ForAll<TSource>.

   var source = Enumerable.Range(100, 20000);
 
 
            var parallelQuery = from num in source.AsParallel()
                                where num % 10 == 0
                                select num;
 
            // Rezultatele sunt procesate in paralel
            parallelQuery.ForAll((e) => DoSomething(e));

Bibliografie[modificare | modificare sursă]