Sdílet prostřednictvím


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 je například System.Xml.Linq.Extensions.

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í, se také musíte rozhodnout, zda implementovat metodu pomocí opožděného vyhodnocení nebo okamžitého vyhodnocení.

  • Při líném vyhodnocení se při každém volání iterátoru zpracuje jeden prvek zdrojové kolekce. Jedná se o typický způsob implementace iterátorů.
  • Při netrpělivém 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ě rozkládá výpočetní zátěž během procesu 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í.

Viz také