Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ett sätt att förbättra prestanda i LINQ till XML är att föra atomisera XName objekt. Föratomering innebär att du tilldelar en sträng till ett XName objekt innan du skapar XML-trädet med hjälp av konstruktorerna i XElement klasserna och XAttribute . I stället för att skicka en sträng till konstruktorn, som skulle använda den implicita konverteringen från sträng till XName, skickar du sedan det initierade XName objektet.
Detta förbättrar prestanda när du skapar ett stort XML-träd där namn upprepas. Det gör du genom att XName deklarera och initiera objekt innan du skapar XML-trädet och sedan använda objekten XName i stället för att ange strängar för element- och attributnamnen. Den här tekniken kan ge betydande prestandavinster om du skapar ett stort antal element eller attribut med samma namn.
Du bör testa föratomering med ditt scenario för att avgöra om du ska använda det.
Exempel: Skapa element på olika sätt, med och utan föratomisering
I följande exempel visas pre-atomisering.
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)
Det här exemplet genererar följande utdata:
<Root>
<Data ID="1">4,100,000</Data>
<Data ID="2">3,700,000</Data>
<Data ID="3">1,150,000</Data>
</Root>
I följande exempel visas samma teknik för ett XML-dokument i ett namnområde:
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)
Det här exemplet genererar följande utdata:
<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>
Följande exempel liknar troligen det du kommer att stöta på i den verkliga världen. I det här exemplet tillhandahålls innehållet i elementet av en fråga:
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")
Det föregående exemplet presterar bättre än i följande exempel, där namn inte är föratomiserade:
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")