Verzögerte Ausführung und Auswertung (LINQ to XML)

Abfrage- und Achsenoperationen werden oft so implementiert, dass sie die verzögerte Ausführung (Deferred Execution) verwenden. In diesem Artikel werden die Voraussetzungen und die Vorteile der verzögerten Ausführung erläutert und einige Überlegungen zur Implementierung angestellt.

Verzögerte Ausführung

Verzögerte Ausführung bedeutet, dass die Auswertung eines Ausdrucks so lange hinausgezögert wird, bis dessen realisierter Wert tatsächlich benötigt wird. Dort, wo große Datensammlungen bearbeitet werden müssen, vor allem in Programmen, die eine Reihe von verketteten Abfragen oder Manipulationen enthalten, kann die verzögerte Ausführung die Arbeitsgeschwindigkeit der Anwendung signifikant erhöhen. Im besten Fall muss bei der verzögerten Ausführung lediglich ein Durchlauf durch die Quellauflistung erfolgen.

Die LINQ-Technologien machen von der verzögerten Ausführung umfangreichen Gebrauch, und dies sowohl bei den Membern der System.Linq-Kernklassen als auch bei den Erweiterungsmethoden in den verschiedenen LINQ-Namespaces, z. B. System.Xml.Linq.Extensions.

Die verzögerte Auswertung wird in der C#-Sprache direkt durch das yield (C#-Verweis)-Schlüsselwort (in Form der yield-return-Anweisung) unterstützt, wenn sie innerhalb eines Iteratorblocks zum Einsatz kommt. So ein Iterator muss eine Auflistung des Typs IEnumerator oder IEnumerator<T> (oder eines abgeleiteten Typs) zurückgeben.

Vergleich von sofortiger Auswertung und verzögerter Auswertung

Beim Schreiben einer Methode, die die verzögerte Ausführung implementiert, können Sie sich auch überlegen, ob die Methode mit verzögerter Auswertung (Lazy Evaluation) oder sofortiger Auswertung (Eager Evaluation) implementiert werden soll.

  • Bei der verzögerten Auswertung wird bei jedem Aufruf des Iterators jeweils ein Element der Quellauflistung verarbeitet. Dies ist die übliche Art und Weise, in der Iteratoren implementiert werden.
  • Bei der sofortigen Auswertung wird beim ersten Aufruf des Iterators die gesamte Auflistung verarbeitet. Eventuell ist auch eine temporäre Kopie der Quellauflistung erforderlich. So muss z. B. die OrderBy-Methode die gesamte Auflistung erst sortieren, bevor sie das erste Element zurückgibt.

Die verzögerte Auswertung hat in der Regel eine höhere Arbeitsgeschwindigkeit zur Folge, weil die Verarbeitung des Mehraufwands gleichmäßig auf die Auswertung der Auflistung verteilt und die Verwendung temporärer Daten minimiert wird. Bei einigen Operationen führt aber natürlich kein Weg an der Materialisierung der Zwischenergebnisse vorbei.

Ein Beispiel für die Programmierung der verzögerten Ausführung in C# und Visual Basic finden Sie unter Beispiel für verzögerte Ausführung.

Siehe auch