Principy Vančurovou v PLINQ
Primárním účelem PLINQ je urychlit provádění LINQ dotazy objekty spuštěním dotazu Delegáti paralelně vícejádrových počítačích. PLINQ provádí nejlépe při zpracování jednotlivých prvků ve zdrojové kolekci je nezávislý, žádné sdílené mezi jednotlivé delegáty dotyčného státu. Tyto operace jsou běžné v LINQ objektů a PLINQ a často nazývá "delightfully paralelní" protože je možné snadno na více podprocesů plánování. Však obsahovat všechny dotazy delightfully paralelních operací; ve většině případů zahrnuje některé operátory, který buď nelze parallelized nebo který zpomalit paralelního spuštění dotazu. A i s dotazy, které jsou zcela delightfully paralelní, musí stále oddílů zdroj dat a plánování práce na podprocesy a po dokončení dotazu obvykle sloučit výsledky PLINQ. Tyto operace přidání výpočetní náklady na parallelization; Přidání parallelization tyto náklady se nazývají režie. Cílem je dosažení optimálního výkonu v dotazu PLINQ částí, které jsou delightfully paralelní maximalizovat a minimalizovat části, které vyžadují režii. Tento článek obsahuje informace, které vám umožní zapsat PLINQ dotazy, které jsou co nejúčinnější při získávání stále správné výsledky.
Že výkon dotazu PLINQ dopad faktory
Následující části uvedeny nejdůležitější faktory tento dopad výkonu paralelní dotazu. Jsou to Obecné příkazy, které samy o sobě nepostačují předpovědět výkon dotazu ve všech případech. Jako vždy je důležité měření skutečného výkonu konkrétní dotazy v počítačích s rozsahem reprezentativní konfigurací a zatížení.
Celková práce výpočetní náklady.
Dosažení Vančurovou PLINQ dotazu musí mít dostatek delightfully paralelní práce k vyrovnání zatížení. Práci lze vyjádřit jako výpočetní náklady každého delegáta vynásobí počet prvků ve zdrojové kolekce. Za předpokladu, že operace mohou být parallelized, tím více výpočetně náročné je větší příležitost Vančurovou. Například pokud funkci spustit jednu milisekundu, sekvenční dotazu nad 1000 prvků vezme jednu sekundu provést operaci, že paralelní dotaz v počítači se čtyřmi jádry trvat pouze 250 milisekund. To dává Vančurovou 750 milisekund. Pro každý prvek spustit jednu sekundu potřeby funkce by Vančurovou 750 sekund. Pokud delegát je velmi náročné, může nabídnout PLINQ významné Vančurovou s pouze několik položek ve zdrojové kolekce. Naopak malé zdrojové kolekce s delegáty trivial nejsou obecně kandidáty pro PLINQ.
V následujícím příkladu je queryA pravděpodobně vhodná pro PLINQ za předpokladu, že thatits funkce Výběr zahrnuje mnoho práce. queryB není pravděpodobně vhodná, protože není dostatek práce v příkazu Select a režie parallelization bude posun většiny nebo všech Vančurovou.
Dim queryA = From num In numberList.AsParallel() Select ExpensiveFunction(num); 'good for PLINQ Dim queryB = From num In numberList.AsParallel() Where num Mod 2 > 0 Select num; 'not as good for PLINQ
var queryA = from num in numberList.AsParallel() select ExpensiveFunction(num); //good for PLINQ var queryB = from num in numberList.AsParallel() where num % 2 > 0 select num; //not as good for PLINQ
Počet logických jádra systému (stupeň rovnoběžnosti).
Tento bod je zřejmé přiznané v předchozí části, dotazy, které jsou delightfully paralelní rychleji v počítačích s více jádry, protože práce mohou být rozděleny mezi více souběžných podprocesů. Celková částka Vančurovou závisí na jaké procento celkové práce dotazu parallelizable. Však není předpokládá, že budou všechny dotazy spustit dvakrát jako rychlé počítače osm core jako čtyři hlavní počítač. Optimalizace dotazů pro optimální výkon je důležité měření skutečné výsledky v počítačích s různými čísly jader. Tento bod se vztahuje bod č. 1: větší objektech DataSet musí využívat větší výpočetní zdroje.
Počet a druh operace.
PLINQ poskytuje provozovatel AsOrdered situací, ve kterých je nezbytné zachovat pořadí prvků v posloupnosti zdroj. Náklady spojené s objednávání, ale tato cena je obvykle mírné. Operace Join a GroupBy podobně utrpět režii. PLINQ funguje nejlépe, když je povoleno zpracování prvků ve zdrojové kolekci v libovolném pořadí a předat další provozovateli, jakmile budou připraveny. Další informace naleznete v tématu Zachování pořadí v PLINQ.
Formulář spuštění dotazu.
Pokud ukládáte výsledky dotazu voláním ToArray nebo ToList, musí výsledky ze všech paralelních podprocesů sloučeny do jedné datové struktury. To zahrnuje nevyhnutelné výpočetní náklady. Podobně pokud výsledky iterovat pomocí smyčky foreach (pro každý v jazyce Visual Basic), výsledky z pracovních podprocesů třeba serializovat na podproces enumerator. Ale pokud chcete provést akci na základě výsledků z každého podprocesu, můžete použít metodu ForAll vykonávat práci na více podprocesů.
Typ volby sloučení.
PLINQ lze nakonfigurovat buď vyrovnávací paměti výstupu a předložit jej bloky nebo najednou po celou sadu výsledků se vyrábí, nebo na jednotlivé výsledky proudu jsou vyrobené. Bývalý výsledkem je snížení celkové doby provádění a druhá možnost vede snížení čekací doby mezi prvky yielded. Při sloučení možnosti vždy nemají významný vliv na celkový výkon dotazu, může ovlivnit výkon, protože mohou řídit jak dlouho uživatel musí počkat na výsledky. Další informace naleznete v tématu Možnosti sloučení v PLINQ.
Druh rozdělení.
V některých případech může být nevyvážený pracovní zatížení dotazu PLINQ přes Indexovatelný zdrojové kolekce. V takovém případě pravděpodobně zvýšíte výkon dotazu vytvořením vlastní partitioner. Další informace naleznete v tématu Vlastní Partitioners PLINQ a TPL.
Když PLINQ zvolí postupné režimu
PLINQ se vždy pokusí spustit dotaz alespoň tak rychlé jako by postupně spustit dotaz. Ačkoli PLINQ nevypadá na to, jak výpočetně nákladné uživatel delegáty, nebo jak velký vstupní zdroj, vyhledat určité dotazu "tvary" Konkrétně hledá operátory dotazu nebo kombinace operátorů, které obvykle způsobují dotaz spustit v režimu paralelního pomaleji. Když najde takové tvary, PLINQ standardně přejde na režim sekvenční.
Však po měření výkonu konkrétní dotaz, mohou stanovit, že ji skutečně rychleji v paralelní režim. V takových případech můžete ParallelExecutionMode.ForceParallelism příznak prostřednictvím ParallelEnumerableWithExecutionMode() Metoda pokyn PLINQ parallelize dotazu. Další informace naleznete v tématu Postupy: Určení režimu spouštění v PLINQ.
Následující seznam popisuje PLINQ ve výchozím nastavení bude spuštěn v režimu sekvenční obrazce dotazu:
Dotazy obsahující Select, indexován, indexované SelectMany nebo ElementAt klauzule po řazení nebo filtrování operátor, který byl odstraněn nebo změněno původní indexy.
Dotazy obsahující vzít, TakeWhile, vynechat, operátor SkipWhile a kde indexy posloupnosti zdroje nejsou v původním pořadí.
Dotazy obsahující Zip nebo SequenceEquals, pokud jeden ze zdrojů dat byl původně objednané index a jiné zdroje dat je Indexovatelný (tj. matice nebo IList(T)).
Dotazy obsahující Concat, pokud je použita ke zdrojům dat Indexovatelný.
Dotazy obsahující obrátit, pokud u zdrojová data Indexovatelný.