Esileht > Alustus > AsParallel()

AsParallel()


IEnumerable<T> meetod AsParallel() tagastab ParallelQuery<T>, millele saab LINQi teha nagu tavaliselt. See on eriti mõnus, sest kasutada võib sisseharjunud lähenemist, samas kui kõik päringud tehakse rööpselt.

Katsetame seda asja pisut. Siin on meie eelmisest korrast tuttav rakendus. Loome massiivi ja teeme talle sama päringut nii jadas kui rööbis.

class Program

{

static void Main(string[] args)

{

double[] values = new double[0xFFFFFF];

Parallel.For(0, values.Length, i => values[i] = i);

DateTime start;

start = DateTime.Now;

values.Count();

Console.WriteLine((DateTime.Now – start).TotalMilliseconds.ToString(“0”));

1

start = DateTime.Now;

values.AsParallel().Count();

Console.WriteLine((DateTime.Now – start).TotalMilliseconds.ToString(“0”));

8

Console.ReadLine();

}

}

Mida me näeme? Seda, et rööpselt võtab töö 8 korda kauem, mis pole ka ime, sest sellist operatsiooni nagu Count() on mõttetu rööpselt teha.

Proovime nüüd midagi natuke keerukamat, võtame näiteks ruutjuure:

values.Select(s => Math.Sqrt(s)).Count();

550

values.AsParallel().Select(s => Math.Sqrt(s)).Count();

133

Ahaa, rööplemine on 4 korda kiirem. (Count() oli vajalik selleks, et päringut reaalselt käivitataks, nimelt on IEnumerable nii kaval, et ei hakka tõmblema, enne kui kirjeid tegelikult vajatakse.)

 

Nagu näete, on AsParallel() mõnus lisa, mis võimaldab juba olemasolevatele ja sissseharjunud päringutele rööplemise lisada, muutmata päringute koodi rohkem kui ühe sõna võrra. Loomulikult toimib see ka sellisel viisil:

 

from s in values.AsParallel() select Math.Sqrt(s)

 

Ja tänase katsetuse õppetund oli see, et päris igale poole ei tasu rööplemist lisada, aga isegi väiksemate tööülesannete puhul võib rööplemine märkimisväärselt aega kokku hoida.

  1. Mati
    16.02.2011, 22:42

    Kas olen millestki valesti aru saanud või midagi märkamata jäänud aga see values.Count() ei ole kasutatav seal. Annab teateks: ‘System.Array’ does not contain a definition for ‘Count’ and no extension method ‘Count’ accepting a first argument of type ‘System.Array’ could be found (are you missing a using directive or an assembly reference?)

    • 17.02.2011, 06:43

      Sul ei ole Linq kasutusel. Lisa üles using System.Linq; ja asi saab korda.

  1. No trackbacks yet.

Lisa kommentaar

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: