У меня есть приложение, которое создает тысячи мелких объектов (свыше 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
, поэтому он принимает на себя ответственность за объекты кучи и автоматически уничтожает их, когда контейнер выходит из сферы действия. При таком решении значительное время по-прежнему тратится на уничтожение объектов.
Есть ли что-нибудь, что я могу сделать, чтобы предотвратить все это время, уничтожая объекты?
ли эти объекты владеют ничего _other_, чем другие объекты с одной и той же жизнью, что все умирают в то же время? У любого из их деструкторов есть преднамеренные побочные эффекты, которые необходимо сохранить? – Useless
@ Бездумно Нет, все объекты имеют одинаковое время жизни, и нет никаких побочных эффектов, которые необходимо укрепить. – packersfan16
Вы измеряли эти моменты с включенными оптимизациями? Кроме того, 65% времени расходуется на деструкторов? – sehe