C#이나 Java와 다르게 C++(물론 C)은 동적 메모리 할당과 해제에 신경을 써야 합니다. 그리고 높은 성능까지 원한다면 메모리 관리자를 직접 만들어서 동적 할당과 해제를 직접 관리하여 실시간으로 동적 할당이 일어나지 않도록 해야 합니다.

 

그러나 범용적인 목적을 가지 메모리 관리자는 만들기가 쉽지 않고 특히 멀티 스레드 환경에서 사용해야 하는 경우는 잘못하면 오히려 더 느려질 수 있습니다.

 

현재 Windows에서는 LFH를 사용하여 이전보다 동적 할당과 해제에 대한 성능을 개선했습니다. 그러나 이것보다 더 성능을 좋게 하는 방법이 있습니다.

그것은 VC++10에서 추가된 라이브러리인 Concurrency Runtime에서 제공하는 메모리 관리자를 사용하는 것입니다.

메모리 할당을 할 때는 Concurrency::Alloc, 메모리 해제를 할 때는 Concurrency::Free 를 사용합니다.

 

MSDN에 있는 샘플 중 new/delete, malloc/free와 비교한 것을 보면 new/delete에 비해서는 3배 정도 성능이 좋습니다.

http://msdn.microsoft.com/en-us/library/dd998050.aspx

 

 

by 흥배 2013. 1. 29. 22:03
  • Lyn 2013.01.30 11:55 ADDR EDIT/DEL REPLY

    누가 할당자로 만들어줬으면 좋겠네요 ㅎㅎ

    • 흥배 2013.01.30 20:29 신고 EDIT/DEL

      크게 힘들지 않을 것 같은데 다른 사람들이 안만들고 있으면 다음에 시간 나는대로 만들어서 공유하겠습니다^^

  • 용태군 2013.02.13 18:19 ADDR EDIT/DEL REPLY

    병렬프로그래밍 코드가 쓰일때만 성능향상이 있는거같은데 맞나요?
    쓰레드가 여러개 있다 하더라도. new/delete가 겹치는 부분이 적으면 성능에 저하가 발생하는거 같은데요.

  • nolimitk 2016.01.06 14:49 ADDR EDIT/DEL REPLY

    테스트 코드도 테스트 결과도 잘못되었습니다.
    ptmalloc의 t-test1정도는 되야 제대로 된 테스트라고 볼수 있는데요.
    각각의 allocation을 테스트하기 위해서는 process를 별도로 실행해야 하며
    한번만 실행한 결과를 내놓는 테스트는 신뢰성이 떨어집니다.
    (process가 처음 실행한 다음 처음 할당을 받을때는 backend heap에서 block을 가져와야 하므로 무조건 제일 느립니다.)

    제가 실제로 테스트 해 본결과 LFH( malloc )와 별 차이 없었습니다.

| 1 |