출처 : http://javawork.egloos.com/1997714

 

3가지 종류의 오픈소스 Memory pool을 테스트 해 봤습니다. Boost(1.34.0) singleton_pool,Loki(0.1.5) SmallObject, ACE(5.5) Dynamic_Cached_Allocator 입니다. 모두thread safe 옵션을 주지 않았습니다.


첫번째 방식은 (alloc, free)x10만번 입니다. 사이즈는 12, 32, 64, 128, 256 으로 변화를 주었습니다. 20번 수행해서 평균을 내었습니다.


ACE가 가장 빠르고 Boost, Loki 순입니다.

두번째 방식은 (alloc)x10만번 (free)x10만번 입니다.


 

첫번째 테스트와 마찬가지로 ACE가 가장 빠르고 Boost, Loki 순입니다. Loki는 사이즈가 커질수록 성능이급격히 나빠지는데 특히 free하는데 많은 시간이 걸렸습니다.(어느 Chunk에 free해야 하는지 찾는데 시간이 걸리는 것같습니다) 이름 자체도 SmallObject인 것으로 보아 알수 있듯이 작은 크기의 객체에 효과적이고, 또 하나의 요인은Modern C++에도 언급이 되어 있는데, 한꺼번에 대량으로 free하는 모델에 취약합니다.

위 테스트에서는ACE가 보편적으로 성능이 좋은 것으로 나오는데, 사실 테스트에 쓰인 ACE_Dynamic_Cached_Allocator는 고정사이즈만을 지원하고, Boost와 Loki는 가변 사이즈도 지원합니다.ACE에는 가변 사이즈를 지원하는 할당기는 없기 때문에따로 제작해서 사용해야 합니다. Modern C++의 작은 객체 할당기챕터에서 가변 사이즈의 할당을 지원하는 방법이 잘 설명되어있습니다. Loki의 SmallObject는 Chunk 계층,FixedAllocator 계층, SmallObjAllocator계층, SmallObject 계층 처럼 4계층으로 나누어서SmallObjAllocator 계층에서 가변 사이즈에 대한 처리가있습니다. 반면에 ACE의Dynamic_Cached_Allocator는 Chunk 계층과 FixedAllocator 계층만을제공하기 때문에 고정사이즈만을 지원합니다.


사용편의성은 Loki의SmallObject가 가장 편합니다. 그냥 SmallObject<>를 상속받기만 하면 되고 상속에 따른 문제도없습니다. ACE_Dynamic_Cached_Allocator는 고정 사이즈만을 지원하는 불편함도 있고, 최대 사이즈도설정해줘야 합니다. 프로그래밍의 대부분의 문제가 그렇듯이 사용편의성이냐 성능이냐의 Trade-off 문제인것 같습니다.


메모리의 할당 유형에 따른 성능 차이도 있습니다. Modern C++에서는 4가지의 유형으로 나누고 있습니다.

  1. 일괄 할당 및 해제
  2. 할당 순서와 동일한 순서로 발생하는 해제 작업(STL 할당자)
  3. 할당 순서와 역순으로 발생하는 해제 작업
  4. 불규칙한 할당과 해제

위 테스트에서 첫번째 유형이 4번이고(완전히 같지는 않습니다만 --;) 두번째 유형이 1번 입니다. SmallObject는 4번의상황에서 좋은 성능을 내고 1번의 상황에는 좋지 않은 성능을 보여줍니다. 4가지의 상황에서 모두 좋은 성능을 내면 좋겠지만대부분의 Memory pool들이 4번의 상황을 최선으로 고려하고 작성하는 것 같더군요. 위의 테스트에서도 첫번째 테스트보다 두번째 테스트가 평균 5배 정도 시간이 더 걸렸습니다. 현재 작성중인 프로그램의 메모리 사용 형태는 어느 유형에 가까운지 분석을 해보고 공개된 pool을 사용하거나 자신만의 pool을 작성하는 것이 좋을 것 같습니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,