Programmering

Sådan arbejder du med Parallel LINQ i C #

Sprogintegreret forespørgsel, også kendt som LINQ, er en pipeline til forespørgsel, der tilføjer forespørgselsfunktioner til sprog, der er målrettet mod det administrerede miljø i .Net. Parallel LINQ, eller PLINQ, er en forespørgselseksekveringsmotor, der kører oven på det administrerede miljø i .Net og drager fordel af flere processorer eller kerner i dit computersystem til at udføre forespørgslerne parallelt. Med andre ord giver det dig mulighed for at optimere dine forespørgsler ved at opdele dem i dele for at udføre disse dele parallelt og dermed øge forespørgslens ydeevne.

PLINQ er en udvidelse til LINQ og blev introduceret som en del af .Net Framework 4. Det er en forespørgselsudførelsesmotor fra Microsoft og er en del af Parallel Extensions Library. Paralleludvidelsesbiblioteket består igen af ​​TPL (Task Parallel Library) og PLINQ. Microsoft har ydet support til parallel programmering i .Net Framework for at udnytte fordelene ved multi-core-systemer. For at udnytte de parallelle programmeringsfunktioner blev en ny klasse kaldet Parallel introduceret i .Net Framework 4.

PLINQ er et godt valg i beregningsbundne operationer. Men hvad handler det om, og hvad er de problemer, det kan løse? Er det hensigtsmæssigt at bruge det i stedet for LINQ, når vi har brug for spørgsmål til data? Vi vil diskutere alle disse på et øjeblik, men lad os først forstå, hvordan PLINQ fungerer bag kulisserne. PLINQ fungerer ved at opdele kilden til data eller input i klumper, som igen udføres af forskellige tråde.

Lidt kode nu

Overvej følgende LINQ-forespørgsel.

var data = fra e hos medarbejdere

hvor e.FirstName.StartsWith ("J")

vælg e;

Du kan nemt konvertere ovenstående forespørgsel til en PLINQ-forespørgsel ved hjælp af AsParallel-udvidelsesmetoden. Bemærk, at AsParallel er en udvidelsesmetode til System.Linq.ParallelEnumerable-klassen.

var data = fra e i medarbejdere.AsParallel ()

hvor e.FirstName.StartsWith ("J")

vælg e;

Hvis du vil bevare rækkefølgen af ​​forespørgselsresultatet, kan du drage fordel af AsOrdered-metoden.

var data = fra e i medarbejdere.AsParallel (). som bestilt ()

hvor e.FirstName.StartsWith ("J")

vælg e;

Du kan også bevare rækkefølgen af ​​de data, der returneres som et resultat af udførelse af PLINQ-forespørgslen ved at videresende QueryOptions.PreserveOrdering som en parameter til AsParallel-metoden.

var data = fra e i medarbejdere.AsParallel (QueryOptions.PreserveOrdering)

hvor e.FirstName.StartsWith ("J")

vælg e;

Bemærk, at brug af AsParallel () -metoden ikke anbefales i små samlinger - det vil hellere køre langsommere sammenlignet med en normal forespørgsel. Hvad hvis du vil tvinge parallelisme? Dette anbefales dog ikke, men du kan udnytte metoden WithExecutionMode-udvidelse for at opnå dette. Her er et eksempel, der illustrerer dette.

var data = fra e i medarbejdere.AsParallel (). WithExecutionMode

(ParallelExecutionMode.ForceParallelism)

hvor e.FirstName.StartsWith ("J")

vælg e;

Bemærk, at ParallelExecutionMode er en optælling, der er tilgængelig som en del af System.Linq-navneområdet og kan have en af ​​disse værdier: Standard og ForceParallelism. Hvis du angiver standard som parameter til WithExecutionMode-udvidelsesmetoden, vil PLINQ udføre forespørgslen parallelt, hvis en forbedring af ydeevnen er tydelig ved paralleludførelse af forespørgslen. Hvis ikke, ville PLINQ udføre forespørgslen ligesom en LINQ-forespørgsel. Tværtimod, hvis du angiver ForeParallelism som en parameter til WithExecutionMode-udvidelsesmetoden, vil PLINQ udføre forespørgslen parallelt, selvom den høje belastning med en præstationsstraff.

Hvordan begrænser jeg graden af ​​parallelisme?

Du skal også være opmærksom på et andet relateret koncept: grad af parallelisme. Dette er et usigneret heltal, der angiver det maksimale antal processorer, som din PLINQ-forespørgsel skal udnytte, mens den er i udførelse. Med andre ord er graden af ​​parallelisme et heltal, der angiver det maksimale antal opgaver, der ville blive udført samtidigt for at behandle en forespørgsel.

I øvrigt er standardværdien af ​​graden af ​​parallelisme 64, hvilket betyder, at PLINQ maksimalt kan udnytte 64 processorer i dit system. Her er hvordan du kan begrænse graden af ​​parallelisme i PLINQ til to processorer i dit system.

var data = fra e i medarbejdere.AsParallel (). WithDegreeOfParallelism (2)

hvor e.FirstName.StartsWith ("J")

vælg e;

Bemærk, hvordan antallet af processorer er videregivet som et argument til WithDegreeofParallelism-metoden. Du skal angive en højere værdi for graden af ​​parallelisme for præstationsgevinster, hvis din forespørgsel udfører mere ikke-beregningsbundet, dvs. ikke-CPU-bundet arbejde.

Jeg kan varmt anbefale at læse dokumentet "Patterns of Parallel Programming" af Stephen Toub. Det giver en grundig diskussion om de parallelle programmeringsmønstre i .Net.