Использование пула памяти (boost::pool) для буферов переменного размера?

Узким местом моего текущего проекта является распределение кучи... профилирование указано примерно в 50% случаев, когда один критический поток проводит с / в new оператор.

Приложение не может использовать здесь стековую память и ему нужно выделить много одной центральной структуры задания - индивидуальной реализации задания / буфера: небольшого и кратковременного, но переменного размера. Объект сам по себе является кучей памяти std::shared_ptr/std::weak_ptr предметы и нести классический C-Array (char*) полезная нагрузка.

В зависимости от конфигурации среды выполнения и рабочей нагрузки в разных частях может создаваться и использоваться объект 300–500 тыс. Одновременно (но обычно этого не происходит). Так как фрагментация памяти приложения для x64 не такая уж большая проблема (но она может быть полезна и для x86).

Чтобы увеличить скорость и пропускную способность пакетов, а также сохранить в будущем фрагментацию памяти, я подумывал об использовании некоторого пула управления памятью, который привел меня к boost::pool,

  1. Почти во всех примерах используется объект фиксированного размера... но я не уверен, что делать с полезной нагрузкой переменной длины? Такой упрощенный объект можно создать с помощью 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;
    }
    
  2. Обычно объекты уничтожаются, когда все ссылки на shared_ptr выходят из области видимости, и я бы не хотел менять shared-ptr обратно на c-ptr. Отложенное уничтожение объектов также должно повысить производительность, а то, что я прочитал, должно работать лучше с boost:pool. Я не нашел, поддерживает ли пул взаимодействие с smart_ptr? Альтернативным, но изворотливым способом было бы сохранить ссылку на shared_ptr при создании вместе с пулом и выпустить их в виде блоков.

У кого-нибудь есть опыт работы с двумя? boost: использование пула с объектами переменного размера и умным указателем взаимодействия?

Спасибо!

0 ответов

Другие вопросы по тегам