我当前项目的瓶颈是堆分配......分析表明一个关键线程在new
操作员中花费的时间大约为 50%。
应用程序不能在这里使用堆栈内存,需要分配大量的一个中央作业结构——自定义作业/缓冲区实现:小而短,但大小可变。该对象本身就是堆内存std::shared_ptr
/std::weak_ptr
对象,并带有经典的 C-Array ( char*
) 有效负载。
根据不同部分的运行时配置和工作负载,可能会创建 300k-500k 对象并同时使用(但这通常不会发生)。由于它的 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:pool 使用可变大小的对象和智能指针交互?
谢谢!