26

我在一些地方玩过 boost::pool ,在我看来,我正在用大量的对象“搅动”严重地敲打堆。通常我使用boost::object_pool, 或boost::pool_alloc作为 STL 模板参数。然而,结果始终是性能几乎没有变化,或者显着恶化。

我很想知道它有什么成功的故事。

我应该在分析输出中寻找哪些可能表明 boost::pool 可能有帮助的东西?

改进旧的 malloc 真的很难吗?

4

4 回答 4

20

内存池是最有效的 imo 事务样式处理,您可以在其中分配给池,然后在事务完成后,将其转储到遗忘中。真正的加速并不是每次分配都会快得多,而是在一个运行时间极长的应用程序中,内存碎片几乎为零。

总的来说,听起来您的应用程序不保证使用内存池

于 2009-01-23T16:46:55.433 回答
16

是的,速度提高了 500%。应用程序(相当愚蠢,但有时你必须使用你得到的东西)在循环中将元素从 1 std::map 复制到另一个(在循环中有一些决策),以及多线程/进程服务器上的结果分配导致堆争用。我在第二张地图上添加了提升池作为分配器,结果是应用程序执行速度提高了 500%。

于 2010-10-13T07:09:27.280 回答
10

盲目优化不好。尝试使用谷歌内存分配器,你甚至不需要重新编译你的应用程序。你可以在这里找到你需要知道的:

http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

加埃塔诺

于 2009-01-23T15:52:37.073 回答
3

在开始优化之前,您可能希望先跟踪内存分配的性能问题。

因此,缩小分析范围以查明问题的位置。这可能是对同一代码的大量调用,而只调用一次可能不会花费很长时间。

于 2009-01-23T14:21:49.643 回答