Post List

2015년 1월 4일 일요일

C++을 위한 XML 파서의 선택

C++용 XML파서는 여러 가지가 있습니다. 몇가지를 나열해 보자면,
사용방법의 난해함, utf-16 미지원등의 이유로 MSXML과 XmlLite 이 두가지만을 사용하게 되었습니다.

MSXML(DOM 방식)
XmlLite(SAX 방식)
제가 있는 팀에서 처음에는 MSXML(DOM 방식)을 wrapping해서 사용했었는데, 어느날 17MB짜리 XML을 파싱하는데90초나 걸리는 것을 보고, 성능을 개선하려고 하다가 DOM 방식이 원래 큰 파일 분석에 느리다는 것을 알고 SAX 방식의 파서를찾아보게 되었습니다. 그 중에 XmlLite가 눈에 뜨여서 테스트를 해보게 되었습니다.

성능 비교
  • XML 파일의 spec : 필드 35개, 레코드 5400개, 용량 17MB
  • MSMLX(DOM 방식) : debug 90초, release 62초
  • XmlLite : debug 15초, release 1.5초
확실히 XmlLite가 빠릅니다. SAX 방식이라서 그런것 같고, 사용법도 다른 SAX 방식의 파서에 비해(!) 쉬운편입니다. 제가 작성한 XmlLite wrapper는 문자열 비교를 많이 하는 편이라 문자열 비교 속도를 개선하면 더 빨라질 수 도 있을 것같습니다. 그리고 XmlLite의 debug와 release 버젼 속도가 많이 차이나는 이유는 제가 작성한 wrapper에서stack과 vector를 사용하기 때문입니다.

SAX 방식이 성능에서 강점을 보이기는 하지만 여전히 DOM 방식의 파서도 사용을 할 예정인데, 크지 않은 파일의 분석이나 설정파일등과 같이 하나씩 접근해서 데이터를 읽어오는 경우에는 DOM 방식이 편합니다.

DOM 방식을 사용하다가 SAX 방식으로 바꾸려니 개념도 안잡히고 쉽지 않았는데, stack을 사용하니 좀 나아지더군요. SAX 방식의 파서를 이용할때는 stack 사용을 강추합니다. --)b  

댓글 없음:

댓글 쓰기