Leistung verketteter Abfragen (LINQ to XML) (C#)Performance of Chained Queries (LINQ to XML) (C#)

Einer der wichtigsten Vorteile von LINQ (und LINQ to XML) besteht darin, dass verkettete Abfragen wie eine einzelne große, kompliziertere Abfrage ausgeführt werden können.One of the most important benefits of LINQ (and LINQ to XML) is that chained queries can perform as well as a single larger, more complicated query.

Eine verkettete Abfrage ist eine Abfrage, die als Quelle eine andere Abfrage verwendet.A chained query is a query that uses another query as its source. Beispielsweise ist im folgenden einfachen Code query2 die Quelle von query1:For example, in the following simple code, query2 has query1 as its source:

XElement root = new XElement("Root",  
    new XElement("Child", 1),  
    new XElement("Child", 2),  
    new XElement("Child", 3),  
    new XElement("Child", 4)  
);  

var query1 = from x in root.Elements("Child")  
             where (int)x >= 3  
             select x;  

var query2 = from e in query1  
             where (int)e % 2 == 0  
             select e;  

foreach (var i in query2)  
    Console.WriteLine("{0}", (int)i);  

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

4  

Diese verkettete Abfrage bietet dasselbe Leistungsprofil wie das Durchlaufen einer verknüpften Liste.This chained query provides the same performance profile as iterating through a linked list.

  • Die Elements-Achse bietet im Wesentlichen die gleiche Leistung wie das Durchlaufen einer verknüpften Liste.The Elements axis has essentially the same performance as iterating through a linked list. Elements wird als Iterator mit verzögerter Ausführung implementiert.Elements is implemented as an iterator with deferred execution. Dies bedeutet, dass neben dem Durchlaufen der verknüpften Liste einige zusätzliche Arbeitsschritte ausgeführt werden, z. B. die Zuweisung des Iteratorobjekts und das Nachverfolgen des Ausführungsstatus.This means that it does some work in addition to iterating through the linked list, such as allocating the iterator object and keeping track of execution state. Diese Arbeitsschritte können in zwei Kategorien eingeteilt werden: einerseits die Schritte, die beim Einrichten des Iterators durchgeführt werden, und andererseits die Schritte, die in jeder Iteration durchgeführt werden.This work can be divided into two categories: the work that is done at the time the iterator is set up, and the work that is done during each iteration. Zum Einrichten sind nur wenige, festgelegte Arbeitsschritte erforderlich, und die Arbeitsschritte, die in jeder Iteration durchgeführt werden, sind proportional zur Anzahl der Elemente in der Quellauflistung.The setup work is a small, fixed amount of work and the work done during each iteration is proportional to the number of items in the source collection.

  • In query1 wird von der Abfrage durch die where-Klausel die Where-Methode aufgerufen.In query1, the where clause causes the query to call the Where method. Diese Methode ist auch als Iterator implementiert.This method is also implemented as an iterator. Die Einrichtung besteht neben den normalen Einrichtungsschritten für einen Iterator aus dem Instanziieren des Delegaten, der auf den Lambdaausdruck verweist.The setup work consists of instantiating the delegate that will reference the lambda expression, plus the normal setup for an iterator. Der Delegat wird bei jeder Iteration aufgerufen, um das Prädikat auszuführen.With each iteration, the delegate is called to execute the predicate. Diese Einrichtungsschritte und die Arbeitsschritte, die in jeder Iteration durchgeführt werden, ähneln den Arbeitsschritten, die beim Durchlaufen einer Iteration der Achse durchgeführt werden.The setup work and the work done during each iteration is the similar to the work done while iterating through the axis.

  • In query1 wird von der Abfrage durch die selectSelect-Klausel die -Methode aufgerufen.In query1, the select clause causes the query to call the Select method. Diese Methode weist dasselbe Leistungsprofil wie die Where-Methode auf.This method has the same performance profile as the Where method.

  • In query2 verfügen sowohl die where-Klausel als auch die select-Klausel über dasselbe Leistungsprofil wie in query1.In query2, both the where clause and the select clause have the same performance profile as in query1.

Die Iteration durch query2 ist daher direkt proportional zur Anzahl der Elemente in der Quelle der ersten Abfrage, mit anderen Worten, zeitlich linear.The iteration through query2 is therefore directly proportional to the number of items in the source of the first query, in other words, linear time. Ein entsprechendes Visual Basic-Beispiel hätte dasselbe Leistungsprofil.A corresponding Visual Basic example would have the same performance profile.

Weitere Informationen zu Iteratoren finden Sie unter yield.For more information on iterators, see yield.

Ein ausführlicheres Tutorial zum Verketten von Abfragen finden Sie unter Tutorial: Verketten von Abfragen.For a more detailed tutorial on chaining queries together, see Tutorial: Chaining Queries Together.

Siehe auchSee Also

Leistung (LINQ to XML) (C#)Performance (LINQ to XML) (C#)