Uppskjuten körning och lat utvärdering (LINQ till XML)

Fråge- och axelåtgärder implementeras ofta för att använda uppskjuten körning. Den här artikeln beskriver kraven och fördelarna med uppskjuten körning och vissa implementeringsöverväganden.

Uppskjuten körning

Uppskjuten körning innebär att utvärderingen av ett uttryck fördröjs tills dess realiserade värde faktiskt krävs. Uppskjuten körning kan avsevärt förbättra prestanda när du måste manipulera stora datasamlingar, särskilt i program som innehåller en serie länkade frågor eller manipuleringar. I bästa fall möjliggör uppskjuten körning endast en enskild iteration via källsamlingen.

LINQ-teknikerna använder sig av uppskjuten körning både i kärnklasserna System.Linq och i tilläggsmetoderna i de olika LINQ-namnrymderna, till exempel System.Xml.Linq.Extensions.

Uppskjuten körning stöds direkt på C#-språket av nyckelordet yield (C# Reference) (i form av -instruktionen) när det yield-return används i ett iteratorblock. En sådan iterator måste returnera en samling av typen IEnumerator eller IEnumerator<T> (eller en härledd typ).

Ivrig kontra lat utvärdering

När du skriver en metod som implementerar uppskjuten körning måste du också bestämma om du vill implementera metoden med hjälp av lat utvärdering eller ivrig utvärdering.

  • I lat utvärdering bearbetas ett enda element i källsamlingen under varje anrop till iteratorn. Det här är det typiska sättet som iteratorer implementeras på.
  • I ivrig utvärdering resulterar det första anropet till iteratorn i att hela samlingen bearbetas. En tillfällig kopia av källsamlingen kan också krävas. Metoden måste till exempel OrderBy sortera hela samlingen innan den returnerar det första elementet.

Lat utvärdering ger vanligtvis bättre prestanda eftersom den fördelar bearbetningen jämnt under utvärderingen av samlingen och minimerar användningen av tillfälliga data. För vissa åtgärder finns det naturligtvis inget annat alternativ än att materialisera mellanliggande resultat.

Se Exempel på uppskjuten körning för ett exempel på uppskjuten körning av programmering i C# och Visual Basic.

Se även