2014-09-23 5 views
1

У меня есть приложение, которое создает тысячи мелких объектов (свыше 500 000). Существует объект-объект, который выделяет эти объекты в кучу.Увеличение скорости уничтожения

Проблема, с которой я сталкиваюсь, заключается в том, что когда объект, содержащий этот меньший объект, выходит из области действия (Драйвер), 65% времени обработки тратится на уничтожение этих небольших объектов.

map, entries и fields удерживайте указатели на абстрактный базовый класс, и каждый базовый класс имеет много дочерних классов.

Архитектура приложения имеет следующий формат:

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

@ Бездумно Нет, все объекты имеют одинаковое время жизни, и нет никаких побочных эффектов, которые необходимо укрепить. – packersfan16

+0

Вы измеряли эти моменты с включенными оптимизациями? Кроме того, 65% времени расходуется на деструкторов? – sehe

ответ

2

Я бы предложил использовать пул памяти для выделения элементов из, например. используя библиотеку Boost Pool.

Если вы не фактически требуют разрушений для каждого элемента (т.е. самих элементы имеют тривиальные деструкторы, хотя они, очевидно, не могут быть POD, так как они имеют виртуальные пользователь) вы можете избежать разрушающих элементов в целом, и освободить все бассейн одним махом. Это устраняет узкое место динамического распределения из уравнения.

Похожие:


В качестве простого измерения (низко висящих фрукты) рассмотреть возможность использования нижепреведенного в быстрой библиотеке кучи, такой как libtcmalloc из google-perftools.

Похожие: