提高POOL使用率 - 单身人士

时间:2011-01-27 12:54:40

标签: c++ boost

我已经开始将boost池用作boost / pool / singleton_pool.hpp中定义的singleton,因为我需要重复分配大量相同大小的结构。由于我之前使用的是malloc,因此性能提升非常出色。

我分配的对象由生产者线程放入列表中,而消费者线程将这些对象从另一端取出并释放对象。但是当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定量的内存?

此外,当生产者的数据速率增加时,总内存使用量似乎以块的形式增加~10k,但即使在为池中的对象调用free之后也永远不会减少。

我想定期做一些内容来释放内存块以减少进程的整体内存使用量。这可能吗?我不能使用purge_memory,因为这意味着我必须在产品和消费者之间同步清除。 BTW会使purge_memory释放块,即减少任务管理器中的内存使用量吗?

我在MS windows中编程。

由于 Niladri

PS - 我尝试通过使池命令(ordered_malloc)来使用release_memory,但它总是返回false。

更新:

还没有尝试过purge_memory,因为池在两个线程之间共享。但是发现release_memory只能用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。

我确信,清除工作会更快。

3 个答案:

答案 0 :(得分:3)

根据doc

bool t.release_memory()

  必须订购。释放没有任何已分配块的每个内存块。如果至少释放了一个内存块,则返回true。

bool t.purge_memory()

  

释放每个内存块。此函数使先前由t的分配函数返回的任何指针无效。如果至少释放了一个内存块,则返回true。

为了释放你的记忆,你需要使用purge_memory()只有当您通过池中的每个指针都不再使用时,您才能这样做!

如果release_memory返回true,那么您的记忆似乎仍在使用中......

MY2C

答案 1 :(得分:1)

这就是boost::pool的工作方式,这就是您的分配如此之快的原因。当您取消分配对象时,您实际上并没有取消分配任何内容。 boost::pool基本上是说内存区域可用于该大小的另一个对象。所以不,当你释放对象时,你不会看到你的内存使用率下降,因为这就是对象池的工作方式。您有一块预先分配的内存,并使用该块内存来创建对象。一个“对象池”,因为它是:)

答案 2 :(得分:-1)

还没有尝试过purge_memory,因为池在两个线程之间共享。 但是发现release_memory只能用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。

我确信,清除工作会更快。