XML Serializer를 이용한 값 복사: 성능은 어떨까!
예전에 XML Serializer를 이용해서 값 복사하는 코드를 소개해 드린 적이 있죠.
XML Serializer를 이용한 값 복사
; https://www.sysnet.pe.kr/2/0/577
그런데, 오늘 웹에서 재미있는 글을 하나 발견했습니다.
Manually Cloning LINQ to XML Trees
; https://learn.microsoft.com/en-us/archive/blogs/ericwhite/manually-cloning-linq-to-xml-trees
"Linq to XML"을 다루다 보면 XElement를 많이 다루게 되지요. 위의 글에서는 순수하게 재귀 함수 호출만을 이용해서 XElement 구조를 복사해 내고 있습니다. 읽고 보니,,, 위의 코드와 XML Serializer를 이용한 코드간의 성능 비교를 해보고 싶었습니다.
결과가 어떨까요? 여러분도 한번 예상해 보십시오.
저는, XElement가 당연히 빠를거라고 생각했습니다. 그도 그럴 수밖에, XML Serializer는 해당 타입에 대한 직렬화를 위해 임시 코드까지 생성해 내야 되고 serialization/deserialization에 대한 비용이 꽤나 들어갈 것 같았기 때문입니다.
일단, 성능 테스트를 위한 코드는 "
Manually Cloning LINQ to XML Trees"에서 나온 코드에서 자식 노드를 늘리기 위해 다음과 같은 정도로만 변경시켰습니다.
XNamespace aw = "http://www.adventureworks.com";
XElement child2 = new XElement(aw + "Child", 2);
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
new XAttribute("a", 1),
new XElement(aw + "Child", 1),
child2,
new XComment("This is a comment.")
);
for (int i = 0; i < 1; i++) // 자식 노드에 따라 성능 측정
{
child2.Add(new XElement(aw + "Child2", 5));
}
아래의 테이블은 위의 코드에서 i 값을 늘려서 측정한 데이터입니다.
i 증가값 |
XML Serializer |
XElement 재귀호출 |
1 |
203 |
0 |
100 |
203 |
16 |
10,000 |
203 |
31 |
100,000 |
344 |
374 |
1,000,000 |
2044 |
3869 |
5,000,000 |
10998 |
19001 |
* 10,000,000 |
28391 |
71875 |
(* 10,000,000회 테스트는 메모리 소모가 2.9GB를 넘어가서 64비트 4GB 메모리 시스템에서 해야 했습니다.)
결과적으로 보면 "XML Serializer" 방식이 레코드가 많은 경우에 괜찮은 성능을 보여주고 있습니다. 1 ~ 10,000회에서 일관되게 203이라는 숫자가 나온다는 것은 임시 코드를 만들어내는 과정에 소요된 것이라 짐작이 되는군요. 즉 실제 직렬화/역직렬화에 걸린 시간은 거의 없다고 봐야 할 것입니다.
첨부된 프로젝트로 위의 테스트를 진행한 것입니다.
[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]