我应该使用boost fast pool allocator进行跟踪吗?

时间:2013-08-01 22:01:54

标签: c++ memory-management boost malloc

我有一台服务器,在整个24小时的过程中不断向一组添加新项目。在24个时期内不会删除元素,只会插入新元素。

然后在句号结束时清除该组,并且新元素开始再次添加24小时。

您认为快速池分配器在重用内存方面是否有用,并可能有助于碎片化?

该集合增长到大约100万个元素。每个元素大约是1k。

1 个答案:

答案 0 :(得分:2)

这种可能性很小......但你当然可以自由地在你的程序中进行测试。

对于那个大小和分配模式的集合(更多!更多!更多!+成长!成长!成长!),你应该使用一组向量。只需将它保存在连续的块中,并在创建它们时reserve(),您永远不需要重新分配/调整大小或浪费空间和带宽遍历列表。矢量将是你的内存布局最好的集合,大。不是一个大的向量(需要很长时间来调整大小),而是几个向量,每个向量代表块(理想的块大小可以根据平台而变化 - 我从每个5MB开始并从那里开始测量)。如果你遵循,你会发现没有必要调整大小或重用内存;只需每隔几分钟为下一个N对象创建一个分配 - 不需要高频/速度对象分配和娱乐。

关于池分配器的事情会建议你想要很多具有不连续分配的对象,大量的插入和删除,如大分配列表 - 这有几个原因是不好的。如果要创建一个优化此大小的连续分配的实现,只需针对带向量方法的块。分配和查找都将接近最小。此时,分配时间应该很小(相对于您所做的其他工作)。那么你的分配模式也没什么异常或令人惊讶的。但是,快速池分配器建议您将此集合视为列表,这将导致此问题的性能下降。

一旦你实现了block + vector方法,一个更好的性能比较(那时)就是比较boost的pool_allocator和std :: allocator。当然,你可以测试所有这三个,但是如果你正确地实现它,那么内存碎片很可能会被那个向量块方法减少得更多。 Reference

  

如果您非常关注性能,请在处理std :: list等容器时使用fast_pool_allocator,并在处理std :: vector等容器时使用pool_allocator。