XName 개체의 사전 원자화(LINQ to XML)
LINQ to XML의 성능을 향상시키는 한 가지 방법은 XName 개체를 사전 원자화하는 것입니다. 사전 원자화는 XName 및 XElement 클래스의 생성자를 사용하여 XML 트리를 만들기 전에 문자열을 XAttribute 개체에 할당하는 것입니다. 그런 다음 문자열을 생성자에 전달하여 문자열을 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);
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)
이 예제는 다음과 같은 출력을 생성합니다.
<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 = "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)
이 예제는 다음과 같은 출력을 생성합니다.
<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>
다음 예제는 실제로 사용될 수 있는 것과 더욱 유사한 코드입니다. 이 예제에서 요소의 내용은 쿼리를 통해 제공됩니다.
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")
위 예제는 이름이 사전 원자화되지 않은 다음 예제보다 더 나은 성능을 제공합니다.
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")
참고 항목
.NET