Использование пула памяти (boost::pool) для буферов переменного размера?
Узким местом моего текущего проекта является распределение кучи... профилирование указано примерно в 50% случаев, когда один критический поток проводит с / в new
оператор.
Приложение не может использовать здесь стековую память и ему нужно выделить много одной центральной структуры задания - индивидуальной реализации задания / буфера: небольшого и кратковременного, но переменного размера. Объект сам по себе является кучей памяти std::shared_ptr
/std::weak_ptr
предметы и нести классический C-Array (char*
) полезная нагрузка.
В зависимости от конфигурации среды выполнения и рабочей нагрузки в разных частях может создаваться и использоваться объект 300–500 тыс. Одновременно (но обычно этого не происходит). Так как фрагментация памяти приложения для x64 не такая уж большая проблема (но она может быть полезна и для x86).
Чтобы увеличить скорость и пропускную способность пакетов, а также сохранить в будущем фрагментацию памяти, я подумывал об использовании некоторого пула управления памятью, который привел меня к boost::pool
,
Почти во всех примерах используется объект фиксированного размера... но я не уверен, что делать с полезной нагрузкой переменной длины? Такой упрощенный объект можно создать с помощью boost::pool, но я не уверен, что делать с полезной нагрузкой? Это можно использовать с
boost:pool
совсем?class job { public: static std::shared_ptr<job> newObj(); private: delegate_t call; args_t * args; unsigned char * payload; size_t payload_size; }
Обычно объекты уничтожаются, когда все ссылки на shared_ptr выходят из области видимости, и я бы не хотел менять shared-ptr обратно на c-ptr. Отложенное уничтожение объектов также должно повысить производительность, а то, что я прочитал, должно работать лучше с boost:pool. Я не нашел, поддерживает ли пул взаимодействие с smart_ptr? Альтернативным, но изворотливым способом было бы сохранить ссылку на shared_ptr при создании вместе с пулом и выпустить их в виде блоков.
У кого-нибудь есть опыт работы с двумя? boost: использование пула с объектами переменного размера и умным указателем взаимодействия?
Спасибо!