성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <br /> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>XML Serializer를 이용한 값 복사: 성능은 어떨까!</div><br /> <br /> 예전에 XML Serializer를 이용해서 값 복사하는 코드를 소개해 드린 적이 있죠.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > XML Serializer를 이용한 값 복사 ; <a target='_tab' href='/2/0/577'>http://www.sysnet.pe.kr/2/0/577</a> </pre> <br /> 그런데, 오늘 웹에서 재미있는 글을 하나 발견했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > Manually Cloning LINQ to XML Trees ; <a target='_tab' href='https://learn.microsoft.com/en-us/archive/blogs/ericwhite/manually-cloning-linq-to-xml-trees'>https://learn.microsoft.com/en-us/archive/blogs/ericwhite/manually-cloning-linq-to-xml-trees</a> </pre> <br /> "Linq to XML"을 다루다 보면 XElement를 많이 다루게 되지요. 위의 글에서는 순수하게 재귀 함수 호출만을 이용해서 XElement 구조를 복사해 내고 있습니다. 읽고 보니,,, 위의 코드와 XML Serializer를 이용한 코드간의 성능 비교를 해보고 싶었습니다.<br /> <br /> 결과가 어떨까요? 여러분도 한번 예상해 보십시오.<br /> 저는, XElement가 당연히 빠를거라고 생각했습니다. 그도 그럴 수밖에, XML Serializer는 해당 타입에 대한 직렬화를 위해 임시 코드까지 생성해 내야 되고 serialization/deserialization에 대한 비용이 꽤나 들어갈 것 같았기 때문입니다.<br /> <br /> 일단, 성능 테스트를 위한 코드는 "<a target='_tab' href='https://learn.microsoft.com/en-us/archive/blogs/ericwhite/manually-cloning-linq-to-xml-trees'>Manually Cloning LINQ to XML Trees</a>"에서 나온 코드에서 자식 노드를 늘리기 위해 다음과 같은 정도로만 변경시켰습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 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 (<b style='color: Blue;'>int i = 0; i < 1; i++</b>) // 자식 노드에 따라 성능 측정 { child2.Add(new XElement(aw + "Child2", 5)); } </pre> <br /> 아래의 테이블은 위의 코드에서 i 값을 늘려서 측정한 데이터입니다.<br /> <br /> <table border="1" cellPadding="2"> <thead> <th>i 증가값</th> <th>XML Serializer</th> <th>XElement 재귀호출</th> </thead> <tbody> <tr> <td>1</td> <td>203</td> <td>0</td> </tr> <tr> <td>100</td> <td>203</td> <td>16</td> </tr> <tr> <td>10,000</td> <td>203</td> <td>31</td> </tr> <tr> <td>100,000</td> <td>344</td> <td>374</td> </tr> <tr> <td>1,000,000</td> <td>2044</td> <td>3869</td> </tr> <tr> <td>5,000,000</td> <td>10998</td> <td>19001</td> </tr> <tr> <td>* 10,000,000</td> <td>28391</td> <td>71875</td> </tr> </tbody> </table> <br /> (* 10,000,000회 테스트는 메모리 소모가 2.9GB를 넘어가서 64비트 4GB 메모리 시스템에서 해야 했습니다.)<br /> <br /> 결과적으로 보면 "XML Serializer" 방식이 레코드가 많은 경우에 괜찮은 성능을 보여주고 있습니다. 1 ~ 10,000회에서 일관되게 203이라는 숫자가 나온다는 것은 임시 코드를 만들어내는 과정에 소요된 것이라 짐작이 되는군요. 즉 실제 직렬화/역직렬화에 걸린 시간은 거의 없다고 봐야 할 것입니다.<br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?wid=653&boardid=331301885'>첨부된 프로젝트</a>로 위의 테스트를 진행한 것입니다.<br /> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
2696
(왼쪽의 숫자를 입력해야 합니다.)