비쥬얼씨뿔뿔 (121.♡.94.55)
2026년 4월 30일 PM 01:13
C++20의 pmr을 쭈욱 몇일을 싱글쓰레드 멀티 쓰레드 테스트를 해봤는데
메모리 풀링도 되고 성능도 그럭저럭 나와서 계속 쓸까 하다가..
하드웨어의 성능을 끝까지 먹어치워야 하는 게임엔진 특성상
메모리 할당 성능이 '그럭저럭'이면 안된다 라는 생각이 들어서
바꾸기로 마음 먹었습니다.
직접 만들까? 라는 생각이 들었습니다. 예전에도 allocator는 OS에서
직접 제공하는 low api 가지고 만들어 봐서 적절한 기능을 가진것을
만들수는 있지만 햄버거 패티 만들겠다고 소키우는 거랑 같은 의미여서..
거기까지는 안가려고 결정했습니다.
C++에서 제공하는 new는 어짜피 malloc과 같은 메모리 할당 + 생성자 초기화 호출
구조라서 malloc만 바꿔치기로 했습니다.
가장 유명한건 facebook의 jedmalloc과 google의 tcmalloc이 있습니다.
둘다 성능 잘나오고 최적화 잘한 유명한 allocator입니다.
다만 둘다 좀 무겁습니다. 온갖 쓰레드 로컬 변수와 캐시들이 난무를 하죠..
코드가 그렇게 복잡하진 않은데.. 그래도 무거운건 좀 싫더군요. ㅎㅎ
그러다가 Microsoft에서 오픈소스로 풀었던 mimalloc이 생각났고..
받아서 테스트 해봤습니다.
오오 역시 가볍고 빠르고 좋습니다.
요즘 mimalloc인기가 가장 많다고 하더니.. 사실인것 같습니다.
Windows용 MacOS용 두 OS용으로 빌드하고 바로 통합해서 테스트 해봤습니다.
테스트는 윈도우에서만 일단 해봤습니다.
sys_alloc이 mimalloc입니다.

성능이 잘나옵니다. 디버그 모드에서는 여러 체크코드들이 있어서 더 느린데..
실성능인 Release빌드를 해서 보면 엄청난 성능을 보여줍니다.
stl사용시 동적할당을 제로로 만들기 위해서 사용하는 temp 할당자와 비슷한 성능을 보여줄 정도 입니다.
아마 내부에서 메모리 캐시 역할을 아주 훌륭히 수행하는 것 같습니다.
컴파일 쉽고 가볍고 빠르고.. 또 여러 벤치마크 성능을 봤을땐 대형 데이터 쓰르풋에서도
여전히 훌륭한 성능을 보여주니.. mimalloc을 사용하기로 했습니다!
mimalloc을 적용하고 new/delete 구현 한다음.. c++20의 std::source_location을 이용해서
할당시 해당 호출의 소스코드이름과 라인, 그리고 함수명을 기록하여 메모리 트래킹 하는 구조도 만들었습니다.
이제 할당자는 서버를 만들던 렌더링 엔진을 만들던 얘로 그냥 통일 하면 될것 같습니다.
댓글 (2)
-
시시리니
05.09 · 121.♡.36.156
-
코코끼리대파
05.26 · 183.♡.235.33
php 8.5 에 외부 메모리 할당자로 보다가 jedmalloc 가 성능 좋더라구요
댓글을 작성하려면 이 필요합니다.
C++ 배울 때가 엊그제 같은데 저는 현업에서 안쓴지 이제 너무 오래되었네요. 그나저나 벌써 20 표준이 현업에서 쓰이고 있나요?!