預先不可部分完成 XName 物件 (LINQ to XML)
在 LINQ to XML 中,改善效能的其中一種方式就是預先不可部分完成 XName 物件。 預先不可部分完成是表示,您先指派字串給 XName 物件,然後再使用 XElement 和 XAttribute 類別 (Class) 的建構函式 (Constructor) 來建立 XML 樹狀結構。 接著,您會傳遞初始化的 XName 物件,而非將字串傳遞至建構函式 (會使用隱含轉換,從字串轉換成 XName)。
當您建立重複特定名稱的大型 XML 樹狀結構時,這樣做可以改善效能。 若要這樣做,請在建構 XML 樹狀結構之前宣告並初始化 XName 物件,然後使用 XName 物件,而非指定項目和屬性名稱的字串。 如果您使用相同的名稱來建立大量項目 (或屬性),這項技巧可能會大幅提升效能。
您應該使用自己的案例來測試預先不可部分完成,以便決定是否應該使用此作業。
範例
下列範例為其示範。
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);
此範例會產生下列輸出:
<Root>
<Data ID="1">4,100,000</Data>
<Data ID="2">3,700,000</Data>
<Data ID="3">1,150,000</Data>
</Root>
下列範例顯示 XML 文件位於命名空間中的相同技巧:
XNamespace aw = "https://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);
這個範例會產生下列輸出:
<aw:Root xmlns:aw="https://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>
下列範例更類似於您可能會在真實世界中遇到的狀況。 在此範例中,項目的內容是由查詢提供:
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);
上一則範例的執行效能比下列範例要好,因為其名稱並非預先不可部分完成:
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);