예전에 XML Serializer를 이용해서 값 복사하는 코드를 소개해 드린 적이 있죠.
그런데, 오늘 웹에서 재미있는 글을 하나 발견했습니다.
"Linq to XML" 을 다루다 보면 XElement 를 많이 다루게 되지요. 위의 글에서는 순수하게 재귀 함수 호출만을 이용해서 XElement 구조를 복사해 내고 있습니다. 읽고 보니,,, 위의 코드와 XML Serializer 를 이용한 코드간의 성능 비교를 해보고 싶었습니다.
결과가 어떨까요? 여러분도 한번 예상해 보십시오.
저는, XElement 가 당연히 빠를거라고 생각했습니다. 그도 그럴 수 밖에, XML Serializer 는 해당 타입에 대한 직렬화를 위해 임시 코드까지 생성해 내야 되고 serialization/deserialization 에 대한 비용이 꽤나 들어갈 것 같았기 때문입니다.
일단, 성능 테스트를 위한 코드는 "Manually Cloning LINQ to XML Trees" 에서 나온 코드에서 자식 노드를 늘리기 위해 다음과 같은 정도로만 변경시켰습니다.
아래의 테이블은 위의 코드에서 i 값을 늘려서 측정한 데이터입니다.
(* 10,000,000 회 테스트는 메모리 소모가 2.9GB 를 넘어가서 64비트 4GB 메모리 시스템에서 해야 했습니다.)
결과적으로 보면 "XML Serializer" 방식이 레코드가 많은 경우에 괜찮은 성능을 보여주고 있습니다. 1 ~ 10,000 회에서 일관되게 203 이라는 숫자가 나온다는 것은 임시 코드를 만들어내는 과정에 소요된 것이라 짐작이 되는 군요. 즉 실제 직렬화/역직렬화에 걸린 시간은 거의 없다고 봐야 할 것입니다.
첨부된 프로젝트로 위의 테스트를 진행한 것입니다.
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 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 이라는 숫자가 나온다는 것은 임시 코드를 만들어내는 과정에 소요된 것이라 짐작이 되는 군요. 즉 실제 직렬화/역직렬화에 걸린 시간은 거의 없다고 봐야 할 것입니다.
첨부된 프로젝트로 위의 테스트를 진행한 것입니다.
[출처] XML Serializer 를 이용한 값 복사: 성능은 어떨까! |작성자 techshare
'알고리즘' 카테고리의 다른 글
C# 날짜관련 달력관련 (0) | 2012.01.15 |
---|---|
고성능 알고리즘 탐구 (0) | 2009.05.07 |
Converting math equations to C# (0) | 2009.04.23 |
방정식, 미적분법 그리고 delegate (0) | 2008.10.01 |
한글,영문 섞여 있을때 문자의 수 or Byte수 구하기.. (C#) (0) | 2008.02.27 |