자체컨테이너를 왜 쓸까?
- 많은 회사들, 특히 C++을 사용하는 회사들의 경우 자체 컨테이너를 제작하여 씁니다.
- C++에는 STL이라는 기본적으로 제공하는 컨테이너가 있음에도 불구하구요
- 에픽 게임즈의 언리얼 엔진의 경우에는
TMap, TArray, TSet같은 컨테이너를 지원하구요
- 세계적인 대기업인 EA게임즈의 경우에도
EASTL이라는 자체 stl을 제작하여 사용하고 이를 오픈소스로 공개해놓기도 하였습니다.
- 대체 왜 무료, 다양한 기능, 표준화된 템플릿을 제공하는 C++STL을 쓰지 않고 자체적으로 컨테이너를 만들어 쓸까요?
세간에 떠도는 STL괴담
- 세간에서 말하는 STL을 쓰지 않는 이유들은 다음과 같습니다.
- 게임을 제작할 때 필요없는 부가적인 기능들이 많다
- 범용성을 챙기느라 좋은 성능을 챙기지 못했다
- 알게 모르게 일어나는 메모리 할당/해제가 많다
- 범용성을 위한 기능들 때문에 빌드 속도가 느리다
- 등등…
- 그리고 자체 컨테이너의 장점은 다음과 같습니다.
- 직접 만든 코드라서 커스텀하고 새로운 기능을 구현하기 쉽다
- 범용성이 필요 없기에 좋은 성능을 만들어내기 좋다
제가 직접 만들어보고 판단하겠습니다
- 그런데 그렇다더라 하는 소문과 말만 듣고 편견을 가지는건 나쁜 일이죠
- 그러면 어떻게 해야할까요? 직접 컨테이너들을 만들어보고 성능을 비교해보면 됩니다!
- 자료구조가 단순할수록 큰 차이가 없을거기 때문에 비교적 복잡도가 높은 직접 구현한
HashMap을 통해 비교해보도록 하죠!
테스트 환경
- 측정 시간: Add, Find, Remove 연산 10000번 반복
- 테스트 타입
- Test1:
- Test2:
- KeyType →
String
- HashFunction →
CityHash
- 두 컨테이너는 모두 해시 버켓과 리스트들을 삽입한 아이템 개수의 2배 양만큼 Reserve 해놓은 상태입니다.
성능 결과
결과: (STL소모시간)/(자체컨테이너 소모시간)
| Trial0 | Trial1 | Trial2 | Trial3 | Trial4 | Avg. |
|---|
| Test1 (int) | 2.1940 | 2.2889 | 2.2257 | 2.5608 | 2.0360 | 2.26108 |
| Test2 (String) | 1.8012 | 1.8312 | 1.5827 | 1.5707 | 1.5303 | 1.66322 |
결론
- 간단한 int 해시의 경우 자체 컨테이너가 2배 이상 빨랐습니다.
- 비교적 복잡한 해시 연산의 String 해시의 경우 자체 컨테이너가 1.6배 정도 빨랐습니다.
- STL 컨테이너가 제공하는 기능 중 추가, 탐색, 제거를 제외하고 전체 아이템 이터레이션과 같은 기능을 같이 고려하여 제작했어도 전반적인 성능에서 더욱 좋은 결과를 낼 수 있었습니다.
코드 출처