Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A LINQ és az XML teljesítményének javításának egyik módja az objektumok előzetes atomizálása XName . Az előzetes atomizálás azt jelenti, hogy az XML-fa létrehozása előtt sztringet rendel egy XName objektumhoz az osztályok és XAttribute az XElement osztályok konstruktorainak használatával. Ezután ahelyett, hogy egy sztringet adna át a konstruktornak, amely a sztring XNameimplicit konvertálását használná, az inicializált XName objektumot adja át.
Ez javítja a teljesítményt egy nagy XML-fa létrehozásakor, amelyben a nevek ismétlődnek. Ehhez deklarálja és inicializálja XName az objektumokat az XML-fa létrehozása előtt, majd az objektumokat használja az XName elem- és attribútumnevek sztringjeinek megadása helyett. Ez a technika jelentős teljesítménynövekedést eredményezhet, ha nagy számú, azonos nevű elemet vagy attribútumot hoz létre.
Tesztelje az előzetes atomizálást a forgatókönyvével, hogy eldöntse, használja-e.
Példa: Elemek létrehozása különböző módokon, előre atomizálással és anélkül
Az alábbi példa a atomizálás előtti folyamatokat mutatja be.
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)
Ez a példa a következő kimenetet hozza létre:
<Root>
<Data ID="1">4,100,000</Data>
<Data ID="2">3,700,000</Data>
<Data ID="3">1,150,000</Data>
</Root>
Az alábbi példa ugyanazt a módszert mutatja be egy XML-dokumentumhoz egy névtérben:
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)
Ez a példa a következő kimenetet hozza létre:
<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>
Az alábbi példa jobban hasonlít arra, amit a való világban valószínűleg tapasztalni fog. Ebben a példában az elem tartalmát egy lekérdezés adja meg:
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")
Az előző példa jobban teljesít, mint az alábbi példa, amelyben a nevek nincsenek előre atomizálva:
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")