Visual Studio 2008부터 쓸 수 있게 된 STL/CLR. 기대에는 못 미친다는 걸 알게 됐다. 문제가 무엇인고 하니, 바로 성능이 떨어진다는 것이다. 조금 떨어지는 것이라면 참고 쓸 수도 있겠만, 이건 정도가 심하다. A look at STL/CLR performance for linear containers는 C++/CLI in Action의 저자인 Nishant Sivakumar가 쓴 글인데, 뭐가 문제인지 잘 설명해놨다.
닷넷 프레임워크에 제공되는 기본 컨테이너를 두고 몇 배씩 쳐지는 성능을 감내할 이유가 있을까 싶다. 결국 잠깐 STL/CLR을 써볼까 했다가 이 글을 읽고 관두기로 했다.
댓글을 읽어보면 몇 가지 의문점을 지적하는데, 나 역시 미련을 못 버리고 직접 테스트를 해봤다. 우선 BCL 컨테이너는 ngen으로 미리 컴파일해 놓은 상태라 공정하지 못한 테스트다라는 지적을 검토해보고자, 기사에 나온 테스트 코드를 직접 돌려봤다. VectorInsertRemove
와 GenericListInsertRemove
를 각각 10만 번씩 돌린 후, 다시 10만 번씩 돌렸다. 처음 10만번 돌린 것은 Just in Compile이 될 기회를 준 것이다. 이렇게 하면 두 번째 돌렸을 때 공정한 결과를 얻을 수 있다. 테스트 결과는 역시나 Nishant Sivakumar의 말이 맞다는 걸 입증할 뿐이었다. 이 정도 내공을 가진 저자가 이런 초보적인 실수를 했으리라 생각하는 것 자체가 우습긴 하다.
두 번째 지적은 Checked Iterators를 쓴 게 아니냐라는 문제 제기였다. Visual Studio 2005부터 릴리즈 빌드를 할 때조차 기본적으로 Checked Iterators를 쓰게 설정되어 있다는 걸 이번 기회에 알게 되어 소득이 있었지만, 역시나 이 문제도 아니었다. Checked Iterator 설정을 꺼봤지만 결과는 마찬가지였다.
네이티브 C++ 개발자가 CLR 세상에 발을 들여놓기 쉽게 해주려는 시도는 좋았지만, 성능 차이가 이렇게 많이 나서는 역시 못 써먹겠다.