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.

Advertisements
  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

Kommenteerimiseks palun logi sisse, kasutades üht neist võimalustest:

WordPress.com Logo

Sa kommenteerid kasutades oma WordPress.com kontot. Logi välja / Muuda )

Twitter picture

Sa kommenteerid kasutades oma Twitter kontot. Logi välja / Muuda )

Facebook photo

Sa kommenteerid kasutades oma Facebook kontot. Logi välja / Muuda )

Google+ photo

Sa kommenteerid kasutades oma Google+ kontot. Logi välja / Muuda )

Connecting to %s

%d bloggers like this: