2012-05-05 2 views
5

MyOrder 클래스에 대한 사용자 지정 연산자 new 및 연산자 delete를 작성했습니다. boost :: singleton pool을 사용하여 메모리를 할당하려고합니다. 다음은 성능 테스트 프로그램,부스트 싱글 톤을 사용하는 사용자 지정 할당이 기본값보다 느림

#include <boost/pool/singleton_pool.hpp> 
#include <boost/progress.hpp> 
#include <iostream> 
#include <new> 
#include <vector> 


class MyOrder{ 
    std::vector<int> v1_; 
    std::vector<double> v2_; 

    std::string s1_; 
    std::string s2_; 

public: 
    MyOrder(std::string s1, std::string s2): s1_(s1), s2_(s2) {} 

    ~MyOrder(){} 

    static void * operator new(size_t size); 
    static void operator delete(void * rawMemory) throw(); 
}; 

struct MyOrderTag{}; 
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool; 

void* MyOrder:: operator new(size_t size) 
{ 
    if (size != sizeof(MyOrder)) 
     return ::operator new(size); 

    while(true){ 
     void * ptr = MyOrderPool::malloc(); 
     if (ptr != NULL) return ptr; 

     std::new_handler globalNewHandler = std::set_new_handler(0); 
     std::set_new_handler(globalNewHandler); 

     if(globalNewHandler) globalNewHandler(); 
     else throw std::bad_alloc(); 

    } 
} 

void MyOrder::operator delete(void * rawMemory) throw() 
{ 
    if(rawMemory == 0) return; 
    MyOrderPool::free(rawMemory); 
} 

int main() 
{ 
    MyOrder* mo = NULL; 
    std::vector<MyOrder*> v; 
    v.reserve(100000); 

    boost::progress_timer howlong; 
    for(int i = 0; i< 100000; ++i) 
    { 
     mo = new MyOrder("Sanket", "Sharma"); 
     v.push_back(mo); 
    } 

    for (std::vector<MyOrder*>::const_iterator it = v.begin(); it != v.end(); ++it) 
    { 
     delete *it; 
    } 
    return 0; 
} 

I는 -O2 플래그를 사용하여 위의 프로그램을 컴파일 및 2.26 GHz의 인텔 코어 2 듀오 내 맥북에서 실행하고 0.16 초 걸렸습니다. 그런 다음 사용자 정의 연산자 new와 operator delete를 선언하고 정의한 행을 주석 처리하고 -O2 플래그로 다시 컴파일 한 후 0.13 초가 걸린 동일한 시스템에서 실행했습니다.

동일한 크기의 객체에 대해 singleton_pool을 사용하여 메모리 할당 및 할당 해제 속도를 높여야합니다. 왜 속도가 느려지 죠? 또는이 작은 프로그램에서 얻은 성능 이점을 무효로하는 풀을 만드는 오버 헤드가 있습니까? 업데이트

:

나는 int로 더블로 두 표준 : : 문자열 변수를 대체 이번에는 100,000,000 (전 즉 1000 배)와 두 프로그램 3.0 GHZ AMD 페넘 (TM 각을 반복 실행) II X4 945 프로세서. 사용자 지정 메모리 할당을 사용하는 데는 3.2 초가 걸리고 기본 메모리 할당을 사용하는 데는 8.26 초가 걸립니다. 따라서 이번에는 맞춤 메모리 할당이 이깁니다.

+1

* 모든 * 새로운 핸들러. –

+1

당신의 테스트는'std :: string'에 의한 할당을 포함하고 있습니다.이 할당은 커스텀 할당 자에 의해 관리되지 않기 때문에, 당신이 얻는 결과는 가장 좋은 것입니다. – Chad

+0

@Chad std :: string을 double 및 int로 바꿨습니다. 이번에는 10000000 번 반복합니다. 결과는 1.95s 대 기본 사용자 2.29s입니다. 풀을 사용한 할당/할당 해제가 느립니다. – sank

답변

5

숫자가 의미가 없다고 생각합니다. 런타임을 한 번만 확인한 경우 0.130.16 초를 사용하면 그다지 의미가 없으며 오버 헤드가 우세합니다.

수천 번 테스트하려는 스 니펫을 실행 한 다음 데이터를 비교하여 오버 헤드를 배제해야합니다.

아니 정말하지 0.03초의 차이는 쉽게 등을 바꿔지고 프로세스에 의해 설명 될 수

하나 * 새로운 핸들러가, 당신은 아마 시도하는 루프를 작성해야 * 호출하는 문제를 고려하고 있기 때문에
관련 문제