2014-09-23 3 views
1

수천 개의 작은 개체를 생성하는 응용 프로그램이 있습니다 (상위 500,000 개). 이러한 객체를 힙에 할당하는 객체 팩토리가 있습니다.파괴 속도 증가

이 작은 객체를 보유하고있는 객체가 범위 (드라이버)를 벗어나면 65 %의 처리 시간이이 작은 객체를 파괴하는 데 소모된다는 것입니다.

map, entriesfields에는 추상 기본 클래스에 대한 포인터가 들어 있으며 각 기본 클래스에는 많은 하위 클래스가 있습니다.

class Driver { 

    boost::ptr_map<std::string, Class1-Base> map; 
} 

class Class1-Base { 

    boost::ptr_vector<Class2-Base> entries; 
} 

class Class2-Base { 
    boost::ptr_vector<Class3-Base> fields; 
} 

class Class3-Base { 
    unsigned long value; 
} 

내가 시도 여러 가지 방법이 응용 프로그램의 성능을 높일 수 :

응용 프로그램 아키텍처는 다음 형식을 따릅니다.

내가 먼저 일반 포인터와 데이터 구조를 사용하고 명시 적으로 클래스의 소멸자에서 삭제 된 개체를.

그때 boost::shared_ptr<>와 데이터 구조를 사용하여 시도하지만 난 그 참조 횟수가 상당한 오버 헤드를 발생하고 큰 혜택을 제공하지 않았다 결정했다.

지금까지 나온 해결책은 boost::ptr_container을 사용하므로 힙 개체의 소유권을 가져오고 컨테이너가 범위를 벗어날 때 자동으로 삭제합니다. 이 솔루션을 사용하면 개체를 파괴하는 데 많은 시간을 소비 할 수 있습니다.

이번에는 개체가 파괴되는 것을 막기 위해 할 수있는 일이 있습니까?

+0

이러한 개체 아무것도 가지고 있습니까 _other_ 동시에 모든 사람이 죽은 것 같은 수명이 다른 개체보다? 그들의 소멸자 중 누구라도 당신이 보존해야 할 고의적 인 부작용이 있습니까? – Useless

+0

@Useless 아니요, 모든 개체의 수명이 같으며 부작용이 없습니다. – packersfan16

+0

최적화가 활성화 된 시간을 측정 했습니까? 또한, _what_ 시간 중 65 %가 소멸자에 소비됩니까? – sehe

답변

2

메모리 풀을 사용하여 요소를 할당하는 것이 좋습니다 (예 : Boost Pool 라이브러리를 사용합니다. 당신이하지 실제로 할 경우

는 모두 요소를 파괴한다 피할 수 있습니다 (자신이들은 가상 구성원이 있기 때문에 그들은 분명히 POD가 될 수는 없지만, 사소한 소멸자를 가지고 즉, 요소), 전체를 공개 요소마다 파괴를 필요 수영장 하나가 급습했다. 이렇게하면 방정식에서 동적 할당 병목 현상이 제거됩니다.

관련 :


합니다 (낮은 매달려 과일)는 드롭을 사용하는 것이 좋습니다 google-perftools의 libtcmalloc과 같은 빠른 힙 라이브러리에 있습니다.

관련 :