Freigeben über


Verzögerte Ausführung und faule 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 Anforderungen und Vorteile der verzögerten Ausführung sowie einige Implementierungsüberlegungen erläutert.

Verzögerte Ausführung

Verzögerte Ausführung bedeutet, dass die Auswertung eines Ausdrucks verzögert wird, bis der realisierte Wert tatsächlich erforderlich ist. Die verzögerte Ausführung kann die Leistung erheblich verbessern, wenn Sie umfangreiche Datensammlungen bearbeiten müssen, insbesondere in Programmen, die eine Reihe von verketteten Abfragen oder Manipulationen enthalten. Im besten Fall ermöglicht die verzögerte Ausführung nur eine einzelne Iteration durch die Quellauflistung.

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 Ausführung wird direkt in der C#-Sprache durch das Schlüsselwort "Rendite" (C# Reference) ( in Form der yield-return Anweisung) unterstützt, wenn sie in einem Iteratorblock verwendet wird. Ein solcher Iterator muss eine Sammlung vom Typ IEnumerator oder IEnumerator<T> (oder einem abgeleiteten Typ) zurückgeben.

Vergleich von sofortiger Auswertung und verzögerter Auswertung

Wenn Sie eine Methode schreiben, die verzögerte Ausführung implementiert, müssen Sie auch entscheiden, ob die Methode mithilfe einer faulen Auswertung oder einer eifrigen Auswertung implementiert werden soll.

  • Bei der faulen Auswertung wird während jedes Aufrufs des Iterators ein einzelnes Element der Quellauflistung verarbeitet. Dies ist die typische Art und Weise, in der Iteratoren implementiert werden.
  • Bei der eifrigen Auswertung führt der erste Aufruf des Iterators dazu, dass die gesamte Sammlung verarbeitet wird. Möglicherweise ist auch eine temporäre Kopie der Quellauflistung erforderlich. Beispielsweise muss die OrderBy Methode die gesamte Auflistung 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. Für einige Vorgänge gibt es natürlich keine andere Möglichkeit als zwischengeschaltete Ergebnisse zu materialisieren.

Siehe Beispiel für verzögerte Ausführung für ein Beispiel zur Programmierung verzögerter Ausführung in C# und Visual Basic.

Siehe auch