Delen via


Uitgestelde uitvoering en luie evaluatie (LINQ naar XML)

Query- en asbewerkingen worden vaak geïmplementeerd om uitgestelde uitvoering te gebruiken. In dit artikel worden de vereisten en voordelen van uitgestelde uitvoering en enkele implementatieoverwegingen uitgelegd.

Uitgestelde uitvoering

Uitgestelde uitvoering betekent dat de evaluatie van een expressie wordt vertraagd totdat de gerealiseerde waarde daadwerkelijk vereist is. Uitgestelde uitvoering kan de prestaties aanzienlijk verbeteren wanneer u grote gegevensverzamelingen moet bewerken, met name in programma's die een reeks gekoppelde query's of manipulaties bevatten. In het beste geval schakelt de uitgestelde uitvoering slechts één iteratie via de bronverzameling in.

De LINQ-technologieën maken uitgebreid gebruik van uitgestelde uitvoering in zowel de leden van kernklassen System.Linq als in de extensiemethoden in de verschillende LINQ-naamruimten, zoals System.Xml.Linq.Extensions.

De uitgestelde uitvoering wordt rechtstreeks in de C#-taal ondersteund door het trefwoord (C#-verwijzing) (in de vorm van de yield-return instructie) wanneer deze wordt gebruikt in een iteratorblok. Een dergelijke iterator moet een verzameling van het type IEnumerator of IEnumerator<T> een afgeleid type retourneren.

Gretige versus luie evaluatie

Wanneer u een methode schrijft waarmee de uitgestelde uitvoering wordt geïmplementeerd, moet u ook beslissen of u de methode wilt implementeren met behulp van luie evaluatie of gretige evaluatie.

  • Bij luie evaluatie wordt één element van de bronverzameling verwerkt tijdens elke aanroep naar de iterator. Dit is de typische manier waarop iterators worden geïmplementeerd.
  • Bij gretige evaluatie leidt de eerste aanroep van de iterator ertoe dat de volledige verzameling wordt verwerkt. Mogelijk is ook een tijdelijke kopie van de bronverzameling vereist. De methode moet bijvoorbeeld OrderBy de hele verzameling sorteren voordat het eerste element wordt geretourneerd.

Luie evaluatie levert meestal betere prestaties op omdat de overheadverwerking gelijkmatig wordt verdeeld tijdens de evaluatie van de verzameling en het gebruik van tijdelijke gegevens wordt geminimaliseerd. Voor sommige bewerkingen is er natuurlijk geen andere optie dan het materialiseren van tussenliggende resultaten.

Zie het voorbeeld van de uitgestelde uitvoering voor het programmeren van uitgestelde uitvoering in C# en Visual Basic.

Zie ook