2

我当前项目的瓶颈是堆分配......分析表明一个关键线程在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 的交互?另一种但古怪的方法是在创建时将对 shared_ptr 的引用与池一起保存并以块的形式释放它们。

有没有人有这两者的经验?boost:pool 使用可变大小的对象和智能指针交互?

谢谢!

4

0 回答 0