예전에 XML Serializer를 이용해서 값 복사하는 코드를 소개해 드린 적이 있죠.

XML Serializer 를 이용한 값 복사; http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&wid=577

그런데, 오늘 웹에서 재미있는 글을 하나 발견했습니다.

Manually Cloning LINQ to XML Trees; http://blogs.msdn.com/ericwhite/archive/2009/01/28/manually-cloning-linq-to-xml-trees.aspx

"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 SerializerXElement 재귀호출
12030
10020316
10,00020331
100,000344374
1,000,00020443869
5,000,0001099819001
* 10,000,0002839171875

(* 10,000,000 회 테스트는 메모리 소모가 2.9GB 를 넘어가서 64비트 4GB 메모리 시스템에서 해야 했습니다.)

결과적으로 보면 "XML Serializer" 방식이 레코드가 많은 경우에 괜찮은 성능을 보여주고 있습니다. 1 ~ 10,000 회에서 일관되게 203 이라는 숫자가 나온다는 것은 임시 코드를 만들어내는 과정에 소요된 것이라 짐작이 되는 군요. 즉 실제 직렬화/역직렬화에 걸린 시간은 거의 없다고 봐야 할 것입니다.

첨부된 프로젝트로 위의 테스트를 진행한 것입니다.
Posted by 퓨전마법사
,