我曾经在boost :: pool中玩了几次,在我看来我正在用很多对象“churn”认真地敲打堆。通常我使用boost::object_pool
或boost::pool_alloc
作为STL模板参数。然而,结果总是表现基本没有变化,或者显着恶化。
我很想知道它有任何成功的故事。
我应该在分析输出中寻找什么样的东西,这可能表明boost :: pool可能会有所帮助?
实际上很难改进好的旧malloc吗?
答案 0 :(得分:20)
内存池对于事务样式处理是最有效的imo,您可以在其中分配到池,然后在事务完成时,将其转储为遗忘。真正的加速并不是每个分配都会快得多,因为在一个运行时间非常长的应用程序中,你将几乎没有内存碎片。
在排序中,听起来您的应用程序不保证使用内存池
答案 1 :(得分:16)
是的,速度提高500%。应用程序(相当愚蠢,但有时你必须使用你所得到的)将1 std :: map中的元素复制到循环中的另一个(在循环中有一些决策),以及在多线程/进程服务器上产生的分配导致堆争用。我在第二张地图上添加了boost池作为分配器,结果是应用程序执行速度提高了500%。
答案 2 :(得分:10)
盲目优化并不好。尝试使用谷歌内存分配器,你甚至不需要重新编译你的应用程序。你可以在这里找到你需要知道的东西:
http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html
加埃塔诺
答案 3 :(得分:3)
在开始优化内存分配之前,您可能希望首先跟踪性能问题。
因此,缩小分析范围以确定问题的位置。这可能是对相同代码的大量调用,只需调用一次就可能不会很长时间。