Увеличение скорости разрушения

У меня есть приложение, которое создает тысячи небольших объектов (свыше 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 таким образом, он становится владельцем объектов кучи и автоматически уничтожает их, когда контейнер выходит из области видимости. С этим решением значительное время все еще тратится на разрушение объектов.

Что я могу сделать, чтобы все это время уничтожать объекты?

1

Решение

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

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

Связанные с:


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

Связанные с:

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector