C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[192] [Boost 살펴보기] 1. pool
Lyn [tohnokanna] 18061 읽음    2009-05-11 15:08
원본링크 http://lunapiece.net/3787

TR1에 포함되지 않은 Boost 의 다른 요소들 중 자주 쓸 만한 것들을 한번 눈여겨 볼까 한다

첫번째 예제는 Pool이다. 메모리를 미리 생성 해 놨다가 해제/생성이 반복 될 경우 미리 생성해 놓은 메모리를 재활용 하는데 유용하게 사용 할 수 있다. 개인적으로도 많이 구현해서 써 보았고 탁월한 메모리 성능을 보여 주는 방법이다.

아래에는 예제코드를 담았다. 예제코드에 있는 주석만으로도 충분히 사용 방법과 기능을 알 수 있을것이라 본다.
첨부한 그림은 아래 코드를 실행한 속도 테스트 스크린샷이다(C++Builder 2009 + Realeas Mode)

일반적으로 메모리를 할당하는것 보다 훨신 빠름을 알 수 있다. 게다가 단편화의 문제도 적다.


#include <cstdlib>
#include <iostream>
#include <cstring>
#include <boost\pool\pool.hpp>
#include <boost\pool\object_pool.hpp>
#include <windows.h>

using namespace std;
using namespace boost;

struct MyData
{
    int i;

    MyData()
    {
        puts("Constructor!");
    };
    ~MyData()
    {
        puts("Destructor!");
    }
};
struct MyData2
{
    int i;
};

MyData2** Array; //임시저장용

void UseNormalPool()
{
    pool<> pool(sizeof(MyData));

    MyData *p = (MyData*)pool.malloc();
    //pool.free(p); //Free를 하지 않을 경우 pool이 파괴 될 때 pool에서 생성한 모든 메모리가 파괴됨.
}

void UseObjectPool()
{
    object_pool<MyData> pool;

    for (int i = 0; i < 1; ++i)
    {
        MyData *p = pool.malloc();
        //기본적으로 같지만 파괴시 Destructor 가 호출됨(주의 : Constructor 는 호출되지 않음)
    }
}
void Test1NewAndDelete()
{
    for (int i = 0;i < 1000000; ++i)
    {
        MyData2* p = new MyData2;
        delete p;
    }
}
void Test1MallocAndFree()
{
    for (int i = 0;i < 1000000; ++i)
    {
        MyData2* p = (MyData2*)malloc(sizeof(MyData2));
        free(p);
    }
}
void Test1BoostPool()
{
    pool<> pool(sizeof(MyData));
    for (int i = 0;i < 1000000; ++i)
    {
        MyData *p = (MyData*)pool.malloc();
        pool.free(p);
    }
}
void Test2NewAndDelete()
{
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = new MyData2;
    }
    for (int i = 0;i < 1000000; ++i)
    {
        delete Array[i];
    }
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = new MyData2;
    }
    for (int i = 0;i < 1000000; ++i)
    {
        delete Array[i];
    }
}
void Test2MallocAndFree()
{
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = (MyData2*)malloc(sizeof(MyData2));
    }
    for (int i = 0;i < 1000000; ++i)
    {
        free(Array[i]);
    }
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = (MyData2*)malloc(sizeof(MyData2));
    }
    for (int i = 0;i < 1000000; ++i)
    {
        free(Array[i]);
    }
}
void Test2BoostPool()
{
    pool<> pool(sizeof(MyData2));
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = (MyData2*)pool.malloc();
    }
    for (int i = 0;i < 1000000; ++i)
    {
        pool.free(Array[i]);
    }
    for (int i = 0;i < 1000000; ++i)
    {
        Array[i] = (MyData2*)pool.malloc();
        //Free후 재할당을 할 경우 이미 생성된 메모리가 재사용됨
        //Free를 하더라도 실제 메모리는 파괴되지 않음
    }
    for (int i = 0;i < 1000000; ++i)
    {
        pool.free(Array[i]);
    }
}
int _tmain(int argc, _TCHAR* argv[])
{
    UseObjectPool();
    UseNormalPool();

    Array = new MyData2*[1000000];
    int TickCount;

    puts("Alloc and Free 1000000 count");
    TickCount = GetTickCount();
    Test1NewAndDelete();
    printf("new And delete : %dms\n", GetTickCount() - TickCount);

    TickCount = GetTickCount();
    Test1MallocAndFree();
    printf("malloc And Free : %dms\n", GetTickCount() - TickCount);

    TickCount = GetTickCount();
    Test1BoostPool();
    printf("boost pool : %dms\n", GetTickCount() - TickCount);

    puts("Alloc 1000000 count and Free 1000000 count");

    TickCount = GetTickCount();
    Test2NewAndDelete();
    printf("new And delete : %dms\n", GetTickCount() - TickCount);

    TickCount = GetTickCount();
    Test2MallocAndFree();
    printf("malloc And Free : %dms\n", GetTickCount() - TickCount);

    TickCount = GetTickCount();
    Test2BoostPool();
    printf("boost pool : %dms\n", GetTickCount() - TickCount);
    system("pause");
    return 0;
}
남병철.레조 [lezo]   2009-05-14 16:12 X
평소 여러 활용 라이브러리들을 간단히라도 누군가 올려주길 바랬는데 좋네요. ^^
nicekr.황경록 [mpbox]   2009-06-15 09:54 X
좋아요~ good - -b
nicekr.황경록 [mpbox]   2009-06-15 09:54 X

+ -

관련 글 리스트
192 [Boost 살펴보기] 1. pool Lyn 18061 2009/05/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.