用于C/C++的多线程内存分配器

Rob*_*uld 35 c c++ memory malloc allocation

我目前有大量的多线程服务器应用程序,我正在四处寻找一个好的多线程内存分配器.

到目前为止,我被撕裂了:

  • 太阳的呃
  • 谷歌的tcmalloc
  • 英特尔的线程构建块分配器
  • Emery Berger的囤积

从我发现的囤积可能是最快的,但我在今天之前没有听说过,所以我怀疑它是否真的像它看起来那么好.任何人都有尝试这些分配器的个人经验?

haz*_*zen 17

我用过tcmalloc并阅读了Hoard.两者都具有类似的实现,并且两者都相对于线程/ CPU的数量(根据其各自站点上的图表)实现大致线性的性能缩放.

所以:如果性能确实非常重要,那就进行性能/负载测试.否则,只需掷骰子并选择其中一个(通过目标平台上的易用性加权).

trshiv的链接来看,看起来像Hoard,tcmalloc和ptmalloc在速度方面都大致相当.总体而言,tt看起来像ptmalloc被优化为尽可能少的空间,Hoard优化了速度+内存使用的权衡,tcmalloc针对纯粹的速度进行了优化.


str*_*dim 11

真正告诉哪个内存分配器适合您的应用程序的唯一方法是尝试一些.提到的所有分配器都是由聪明的人写的,并且会在一个特定的微基准或其他微基准上击败其他分配器.如果你的所有应用程序一整天都在线程A中的malloc一个8字节块并在线程B中释放它,并且根本不需要处理其他任何东西,你可能会编写一个内存分配器来击败任何一个到目前为止列出的那些 它对其他很多东西都没有用.:)

我在工作中使用Hoard有一些经验(足以使最近3.8版本中解决的一个较为模糊的错误是由于这种经历而发现的).这是一个非常好的分配器 - 但对你来说有多好,取决于你的工作量.你必须支付Hoard(虽然它不是太贵),以便在没有GPL代码的商业项目中使用它.

一个非常适应的ptmalloc2已经成为glibc malloc背后的分配器已经有一段时间了,所以它的使用和测试都非常广泛.如果稳定性在所有事情上都很重要,那么它可能是一个不错的选择,但你没有在列表中提及它,所以我认为它已经完成了.对于某些工作负载来说,这很糟糕 - 但任何通用的malloc都是如此.

如果您愿意为此付费(而且价格合理,根据我的经验),SmartHeap SMP也是一个不错的选择.提到的大多数其他分配器都设计为可以LD_PRELOAD'd的drop-in malloc/free new/delete替换.SmartHeap也可以这种方式使用,但它还包括一个完整的分配相关API,可让您根据心脏内容微调分配器.在我们已经完成的测试中(同样,非常特定于特定应用程序),SmartHeap与作为插入式malloc替换时的性能大致相同; 两者之间的真正区别在于定制程度.您可以获得更好的性能,而您需要分配器的通用性更低.

根据您的使用情况,通用多线程分配器可能根本不是您想要使用的; 如果你经常使用malloc并释放大小相同的对象,你可能只想编写一个简单的slab分配器.在Linux内核中适合该描述的几个地方使用了平板分配.(我会给你一些更有用的链接,但我是一个"新用户",而Stack Overflow已经决定不允许新用户在一个答案中提供太多帮助.但谷歌可以提供足够的帮助.)


trs*_*hiv 5

我个人更喜欢并推荐ptmalloc作为多线程分配器.Hoard很好,但在几年前我的团队在Hoard和ptmalloc之间进行的评估中,ptmalloc更好.据我所知,ptmalloc已存在多年,并被广泛用作多线程分配器.

您可能会发现此比较很有用.