Odložené provádění a opožděné vyhodnocení (LINQ to XML)
Operace dotazů a os se často implementují pro použití odloženého spuštění. Tento článek vysvětluje požadavky a výhody odloženého spuštění a některé aspekty implementace.
Odložené spuštění
Odložené spuštění znamená, že vyhodnocení výrazu je zpožděné, dokud se skutečně nevyžaduje jeho dosažená hodnota. Odložené spouštění může výrazně zvýšit výkon, když potřebujete manipulovat s velkými kolekcemi dat, zejména v programech, které obsahují řadu zřetězených dotazů nebo manipulace. V nejlepším případě odložené spuštění umožňuje pouze jednu iteraci prostřednictvím zdrojové kolekce.
Technologie LINQ výrazně využívají odložené spouštění jak ve členech základních System.Linq tříd, tak v rozšiřujících metodách v různých oborech názvů LINQ, jako System.Xml.Linq.Extensionsje například .
Odložené provádění je podporováno přímo v jazyce C# klíčovým slovem yield (referenční dokumentace jazyka C#) (ve formě yield-return
příkazu), pokud se používá v bloku iterátoru. Takový iterátor musí vrátit kolekci typu IEnumerator nebo IEnumerator<T> (nebo odvozeného typu).
Dychtivá vs. opožděné vyhodnocení
Při psaní metody, která implementuje odložené spuštění, musíte se také rozhodnout, zda implementovat metodu pomocí opožděného vyhodnocení nebo dychtivého vyhodnocení.
- V opožděné vyhodnocení se během každého volání iterátoru zpracuje jeden prvek zdrojové kolekce. Jedná se o typický způsob implementace iterátorů.
- Při dychtivých vyhodnocení bude prvním voláním iterátoru zpracována celá kolekce. Může se také vyžadovat dočasná kopie zdrojové kolekce. Například metoda musí seřadit celou kolekci před tím, OrderBy než vrátí první prvek.
Opožděné vyhodnocení obvykle přináší lepší výkon, protože rovnoměrně distribuuje zpracování režie v rámci vyhodnocení kolekce a minimalizuje použití dočasných dat. Samozřejmě, u některých operací není k dispozici žádná jiná možnost než materializovat přechodné výsledky.
Příklad odloženého spuštění v jazyce C# a Visual Basic najdete v příkladu odloženého spuštění.