Odložené spuště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 jeho realizovaná hodnota skutečně nevyžaduje. Odložené spouštění může výrazně zlepšit výkon, pokud potřebujete manipulovat s velkými kolekcemi dat, zejména v programech, které obsahují řadu zřetězovaný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 ve velké části používají odložené spuštění ve členůch základních tříd i v rozšiřujících metodách v různých oborech názvů System.Linq LINQ, jako je System.Xml.Linq.Extensions například .

Odložené spuštění je podporováno přímo v jazyce C# pomocí klíčového slova yield (Referenční dokumentace jazyka C#) (ve formě příkazu), pokud je použito v rámci yield-return bloku iterátoru. Takový iterátor musí vracet kolekci typu IEnumerator nebo IEnumerator<T> (nebo odvozený typ).

Dychtivé vs. opožděné vyhodnocení

Při psaní metody, která implementuje odložené spuštění, je také třeba rozhodnout, zda chcete implementovat metodu pomocí opožděné vyhodnocení nebo dychtivé vyhodnocení.

  • V opožděné vyhodnocení je jeden prvek zdrojové kolekce zpracován během každého volání iterátoru. Jedná se o typický způsob implementace iterátorů.
  • Při dychtivé vyhodnocení bude první volání iterátoru mít za následek zpracování celé kolekce. Může být také potřeba dočasná kopie zdrojové kolekce. Například metoda musí před vrácením prvního prvku seřadit OrderBy celou kolekci.

Opožděné vyhodnocení obvykle poskytuje lepší výkon, protože rovnoměrně distribuuje režijní zpracování během vyhodnocování kolekce a minimalizuje použití dočasných dat. U některých operací samozřejmě neexistuje žádná jiná možnost, než materializovat přechodné výsledky.

Příklad programování odloženého spuštění v jazyce C# najdete v části Deferred execution example for an example of programming deferred execution in C# and Visual Basic.

Viz také