我目前正在评估一些可伸缩的内存分配器,即nedmalloc和ptmalloc(两者都建立在dlmalloc之上),以替代默认的malloc/new,因为在多线程环境中看到了明显的争用。他们发表的表现似乎不错,但是我想检查一下其他真正使用过他们的人的经验。

  • 您的绩效目标是否得到满足?
  • 您是否遇到任何意外或难以解决的问题(例如堆损坏)?
  • 如果您同时尝试了ptmaalloc和nedmalloc,那么建议您选择两者中的哪一个?为什么(易用性,性能)?
  • 还是您可能会推荐另一个可扩展的分配器(免费,首选许可许可证)?
  • 最佳答案

    我已经在我们的应用程序中实现了NedMalloc,我对结果很满意。我以前见过的争用已经消失了,分配器很容易插入,即使一般性能也很好,直到内存分配的开销消失了,应用程序现在几乎无法衡量。

    我没有尝试ptmalloc,因为我没有找到它的Windows就绪版本,一旦NedMalloc对我来说工作正常,我就失去了动力。

    除了提到的两个之外,我认为尝试TCMalloc也可能很有趣-它的某些功能在理论上听起来比NedMalloc更好(例如,与NedMalloc使用的4 B header 相比,小分配的开销很小),但是似乎尚未准备好Windows端口,这也可能变得不那么容易。

    使用NedMalloc几周后,我被迫放弃了它,因为事实证明它的空间开销对我们来说太高了。尤其令我们震惊的是NedMalloc似乎正在以一种坏的方式回收不再用于操作系统的内存,从而使大多数内存仍处于提交状态。现在,我已将它替换为JEMalloc,它似乎并不快(它仍然很快,但不如NedMalloc快),但是它以这种方式非常健壮,并且其可伸缩性也非常好。

    在使用JEMalloc几个月后,我已切换到TCMalloc。与其他版本相比,它花费了更多的精力来适应Windows,但是到目前为止,它的结果(性能和碎片)似乎对我们来说是最好的。

    关于c++ - 可扩展的内存分配器体验,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2514278/

    10-11 15:18