Aracılığıyla paylaş


XName nesnelerinin Önceden Atomizasyonu (LINQ to XML)

LINQ to XML'de performansı geliştirmenin bir yolu nesneleri önceden atomize XName etmektir. Önceden atomizasyon, ve XAttribute sınıflarının oluşturucularını kullanarak XML ağacını oluşturmadan önce bir XName nesneye XElement bir dize atadığınız anlamına gelir. Ardından, bir dizeyi oluşturucuya geçirmek yerine, dizeden XNameöğesine örtük dönüştürmeyi kullanırsınız. Başlatılan XName nesneyi geçirirsiniz.

Bu, adların yinelendiği büyük bir XML ağacı oluşturduğunuzda performansı artırır. Bunu yapmak için, XML ağacını oluşturmadan önce nesneleri bildirir ve başlatırsınız XName ve sonra öğe ve öznitelik adları için dizeler belirtmek yerine nesneleri kullanırsınız XName . Aynı ada sahip çok sayıda öğe veya öznitelik oluşturuyorsanız bu teknik önemli performans kazançları sağlayabilir.

Kullanıp kullanmayabileceğinize karar vermek için senaryonuzla önceden atomlaştırmayı test etmelisiniz.

Örnek: Öğeleri önceden atomizasyon ile ve atomizasyon olmadan çeşitli yollarla oluşturma

Aşağıdaki örnekte önceden atomizasyon gösterilmektedir.

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);
Dim root1 As XName = "Root"
Dim data As XName = "Data"
Dim id As XName = "ID"

Dim root2 As New XElement(root1, 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(root2)

Bu örnek aşağıdaki çıkışı oluşturur:

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

Aşağıdaki örnek, bir ad alanında xml belgesi için aynı tekniği gösterir:

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);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root1 As XName = aw + "Root"
Dim data As XName = aw + "Data"
Dim id As XName = "ID"

Dim root2 As New XElement(root1, 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(root2)

Bu örnek aşağıdaki çıkışı oluşturur:

<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>

Aşağıdaki örnek, gerçek dünyada karşılaşacağınız şeye daha benzerdir. Bu örnekte, öğesinin içeriği bir sorgu tarafından sağlanır:

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);
Dim root1 As XName = "Root"
Dim data As XName = "Data"
Dim id As XName = "ID"

Dim sw As Stopwatch = Stopwatch.StartNew()
Dim root2 As New XElement(root1, From i In Enumerable.Range(1, 100000)
                                 Select New XElement(data, New XAttribute(ID, i), i * 5))
sw.Stop()
Console.WriteLine($"Time to construct: {sw.ElapsedMilliseconds} milliseconds")

Önceki örnek, adların önceden atomize olmadığı aşağıdaki örnekten daha iyi performans gösterir:

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);
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim root As New XElement("Root", From i In Enumerable.Range(1, 100000)
                                 Select New XElement("Data", New XAttribute("ID", i), i * 5))
sw.Stop()
Console.WriteLine($"Time to construct: {sw.ElapsedMilliseconds} milliseconds")

Ayrıca bkz.