我当前项目的瓶颈是堆分配...分析表明,一个关键线程在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的交互?另一种古怪的方法是在创建时将对pool_ptr的引用与池一起保存并以块的形式释放它们。
有没有人有这两个经历? boost:使用可变大小的对象和智能指针交互的池使用情况?
谢谢!