可变大小缓冲区的内存池使用(boost :: pool)?

时间:2013-02-22 13:44:04

标签: memory-pool boost-pool

我当前项目的瓶颈是堆分配...分析表明,一个关键线程在new运算符中花费的时间约占50%。

应用程序不能在这里使用堆栈内存,需要分配许多中央作业结构 - 自定义作业/缓冲区实现:小而短,但大小可变。该对象本身是堆内存std::shared_ptr / std::weak_ptr对象,并带有经典的C-Array(char*)有效负载。

根据不同部分的运行时配置和工作负载,300k-500k对象可能会被创建并同时使用(但通常不会发生这种情况)。由于它的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的交互?另一种古怪的方法是在创建时将对pool_ptr的引用与池一起保存并以块的形式释放它们。

  3. 有没有人有这两个经历? boost:使用可变大小的对象和智能指针交互的池使用情况?

    谢谢!

0 个答案:

没有答案