c++ - 可扩展的内存分配器体验

标签 c++ memory-management winapi multicore

我目前正在评估一些可扩展的内存分配器,即 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/

相关文章:

c++ - 如何处理模板类的 vector ?

c++ - OpenGL - 绘图模式

c++ - 使用贝塞尔曲线创建圆角立方体?

c - 动态内存分配代码解释

.net - 在 CPU 寄存器中分配局部变量

C++ winapi 提升

c++ - 堆栈上的 Const C 字符串?

iOS - 对 ARC 感到困惑并清除对象的 NSMutableArray

c# - 断开用户与托管网络的连接

c++ - 连续 WASAPI 环形缓冲区采样