代码之家  ›  专栏  ›  技术社区  ›  Suma

可扩展内存分配器体验

  •  8
  • Suma  · 技术社区  · 16 年前

    我目前正在评估一些可扩展的内存分配器,即nedmalloc和ptmalloc(都构建在dlmalloc之上),作为默认malloc/new的替换,因为多线程环境中存在大量争用。他们发表的表现似乎不错,但我想看看其他人真正使用他们的经历。

    • 你的绩效目标是否得到满足?
    • 您是否遇到了任何意外或难以解决的问题(如堆损坏)?
    • 如果你同时尝试过ptmaalloc和nedmalloc,你会推荐哪一种?为什么(易用性、性能)?
    • 或者,您可能会推荐另一个可伸缩的分配器(免费,首选许可证)?
    4 回复  |  直到 15 年前
        1
  •  5
  •   Suma    15 年前

    我已经在我们的应用程序中实现了nedmalloc,我对结果非常满意。我以前看到的争用已经消失了,分配器很容易插入,甚至总体性能也非常好,到目前为止,内存分配的开销已经超出了应用程序的范围,几乎无法恢复。

    我没有尝试过ptmalloc,因为我没有找到它的Windows版本,一旦nedmalloc为我工作良好,我就失去了动力。

    除了上面提到的两个,我认为尝试一下也很有趣 TCMalloc -它有一些在理论上比nedmalloc更好的特性(与nedmalloc使用的4b头相比,小分配的开销非常小),但是由于它似乎没有准备好Windows端口,所以也可能变得不太容易。


    使用Nedmalloc几个星期后,我不得不放弃它,因为它的空间开销对我们来说太高了。尤其让我们感到震惊的是,内德马洛克似乎正在重新找回那些已经不再以糟糕的方式用于操作系统的内存,使大部分内存仍然可以使用。现在我已经把它换成了 JEMalloc 这似乎不是那么快(它仍然很快,但不如nedmalloc快),但它在这种方式下非常健壮,其可扩展性也非常好。


    我用了几个月的杰马洛克后,换了一个叫杰马洛的。与其他窗口相比,它需要更多的努力来适应它,但是它的结果(包括性能和碎片)似乎对我们来说是迄今为止所测试的最好的结果。

        2
  •  4
  •   Mumbles    16 年前

    在过去,我需要一种非常快速的方法来分配内存。我发现没有一个配给能胜任这项工作。

    经过几天的搜索,我找到了Boost::Pool,我们在应用程序中的性能提高了300倍。

    我们只需要在我们想要创建的对象上调用malloc/free。虽然有一点设置开销,但必须首先对大量内存进行malloc,但一旦完成,这就非常快了。

        3
  •  1
  •   shoosh    16 年前

    不久前,当我面临多线程争用和严重的碎片问题时,我曾尝试走你的路。经过相当多的测试,我得出结论,在我所遇到的大多数有趣的情况下,这些分配器的好处是微不足道的。

    真正的解决方案是拔出我自己的内存管理器,它专门用于我最经常做的任务。

        4
  •  1
  •   Steve Townsend    15 年前

    如果您使用的是Win32,我的经验是很难打败常规的Windows堆管理器。 如果启用低碎片堆 使用HeapsetInformation API。我相信这是新版Windows的标准配置。它使用互锁*win32基元来处理锁定,而不是使用更简单的mutex/critsec锁定。