Voratomisierung von XName-Objekten (LINQ to XML) (C#)Pre-Atomization of XName Objects (LINQ to XML) (C#)

Eine Möglichkeit zum Verbessern der Leistung in LINQ to XML ist, XName-Objekte vorab zu atomisieren.One way to improve performance in LINQ to XML is to pre-atomize XName objects. Voratomisierung bedeutet, dass einem XName-Objekt eine Zeichenfolge zugeordnet wird, bevor Sie mithilfe der Konstruktoren der XElement-Klasse und der XAttribute-Klasse die XML-Struktur erstellen.Pre-atomization means that you assign a string to an XName object before you create the XML tree by using the constructors of the XElement and XAttribute classes. Anschließend wird anstelle der Übergabe einer Zeichenfolge an den Konstruktor, der die implizite Konvertierung von Zeichenfolge in XName verwenden würde, das initialisierte XName-Objekt übergeben.Then, instead of passing a string to the constructor, which would use the implicit conversion from string to XName, you pass the initialized XName object.

Dies verbessert die Leistung beim Erstellen von großen XML-Strukturen, in denen bestimmte Namen wiederholt werden.This improves performance when you create a large XML tree in which specific names are repeated. Deklarieren und initialisieren Sie hierzu XName-Objekte, bevor Sie die XML-Struktur erstellen, und verwenden Sie dann die XName-Objekte, anstatt für die Element- und Attributnamen Zeichenfolgen anzugeben.To do this, you declare and initialize XName objects before you construct the XML tree, and then use the XName objects instead of specifying strings for the element and attribute names. Mit dieser Vorgehensweise können beim Erstellen einer großen Anzahl von Elementen (oder Attributen) wesentliche Leistungsverbesserungen erzielt werden.This technique can yield significant performance gains if you are creating a large number of elements (or attributes) with the same name.

Sie sollten Voratomisierung innerhalb Ihres Szenarios testen, um eine Entscheidung über die Anwendbarkeit dieses Verfahrens zu treffen.You should test pre-atomization with your scenario to decide if you should use it.

BeispielExample

Dies wird im folgenden Beispiel veranschaulicht:The following example demonstrates this.

XName Root = "Root";  
XName Data = "Data";  
XName ID = "ID";  

XElement root = new XElement(Root,  
    new XElement(Data,  
        new XAttribute(ID, "1"),  
        "4,100,000"),  
    new XElement(Data,  
        new XAttribute(ID, "2"),  
        "3,700,000"),  
    new XElement(Data,  
        new XAttribute(ID, "3"),  
        "1,150,000")  
);  

Console.WriteLine(root);  

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

<Root>  
  <Data ID="1">4,100,000</Data>  
  <Data ID="2">3,700,000</Data>  
  <Data ID="3">1,150,000</Data>  
</Root>  

Im folgenden Beispiel wird dieselbe Vorgehensweise für ein XML-Dokument in einem Namespace erläutert.The following example shows the same technique where the XML document is in a namespace:

XNamespace aw = "http://www.adventure-works.com";  
XName Root = aw + "Root";  
XName Data = aw + "Data";  
XName ID = "ID";  

XElement root = new XElement(Root,  
    new XAttribute(XNamespace.Xmlns + "aw", aw),  
    new XElement(Data,  
        new XAttribute(ID, "1"),  
        "4,100,000"),  
    new XElement(Data,  
        new XAttribute(ID, "2"),  
        "3,700,000"),  
    new XElement(Data,  
        new XAttribute(ID, "3"),  
        "1,150,000")  
);  

Console.WriteLine(root);  

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

<aw:Root xmlns:aw="http://www.adventure-works.com">  
  <aw:Data ID="1">4,100,000</aw:Data>  
  <aw:Data ID="2">3,700,000</aw:Data>  
  <aw:Data ID="3">1,150,000</aw:Data>  
</aw:Root>  

Das folgende Beispiel entspricht eher realen Bedingungen.The following example is more similar to what you will likely encounter in the real world. In diesem Beispiel wird der Inhalt des Elements durch eine Abfrage bereitgestellt:In this example, the content of the element is supplied by a query:

XName Root = "Root";  
XName Data = "Data";  
XName ID = "ID";  

DateTime t1 = DateTime.Now;  
XElement root = new XElement(Root,  
    from i in System.Linq.Enumerable.Range(1, 100000)  
    select new XElement(Data,  
        new XAttribute(ID, i),  
        i * 5)  
);  
DateTime t2 = DateTime.Now;  

Console.WriteLine("Time to construct:{0}", t2 - t1);  

Im vorherigen Beispiel wird eine bessere Leistung als im folgenden Beispiel erzielt, in dem Namen nicht voratomisiert werden:The previous example performs better than the following example, in which names are not pre-atomized:

DateTime t1 = DateTime.Now;  
XElement root = new XElement("Root",  
    from i in System.Linq.Enumerable.Range(1, 100000)  
    select new XElement("Data",  
        new XAttribute("ID", i),  
        i * 5)  
);  
DateTime t2 = DateTime.Now;  

Console.WriteLine("Time to construct:{0}", t2 - t1);  

Siehe auchSee Also

Leistung (LINQ to XML) (C#)Performance (LINQ to XML) (C#)
Atomized XName and XNamespace Objects (LINQ to XML) (C#) (Atomisierte XName- und XNamespace-Objekte (LINQ to XML) (C#))Atomized XName and XNamespace Objects (LINQ to XML) (C#)