gpt4 book ai didi

c++ - 我应该使用 boost 快速池分配器进行跟踪吗?

转载 作者:行者123 更新时间:2023-11-30 04:15:59 24 4
gpt4 key购买 nike

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

然后在周期结束时清除集合,并在接下来的 24 小时内再次开始添加新元素。

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

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

最佳答案

这不太可能……但您当然可以在您的程序中自由测试它。

对于那种大小和分配模式(更多!更多!更多!+增长!增长!增长!)的集合,您应该使用 vector 数组。只需在创建它们时将其保存在连续的 block 和 reserve() 中,您永远不需要重新分配/调整大小或浪费空间和带宽遍历列表。 vector 将最适合您的内存布局,并具有如此大的集合。不是一个大 vector (调整大小需要很长时间),而是几个 vector ,每个代表 block (理想的 block 大小可能因平台而异——我从每个 5MB 开始并从那里开始测量)。如果您遵循,您会发现无需调整大小或重用内存;只需每隔几分钟为下一个 N 对象创建一个分配——不需要高频/高速对象分配和重新创建。

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

一旦您实现了 block + vector 方法,更好的性能比较(此时)将是比较 boost 的 pool_allocator 与 std::allocator。当然,您可以测试所有这三个,但是如果您正确实现它,那么通过 vector block 方法可能会大大减少内存碎片。 Reference :

If you are seriously concerned about performance, use fast_pool_allocator when dealing with containers such as std::list, and use pool_allocator when dealing with containers such as std::vector.

关于c++ - 我应该使用 boost 快速池分配器进行跟踪吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com