我目前正在评估一些可扩展的内存分配器,即nedmalloc和ptmalloc(都建立在dlmalloc之上),作为默认malloc / new的替代,因为在多线程环境中存在明显的争用。他们公布的表现似乎很好,但我想查看其他真正使用它们的人的经历。
答案 0 :(得分:5)
我已将NedMalloc应用到我们的应用程序中,我对结果非常满意。我之前看到的争论已经消失,分配器很容易插入,即使一般性能非常好,直到内存分配的开销已经超出应用程序现在接近无法估量。
我没有尝试过ptmalloc,因为我没有找到它的Windows就绪版本,一旦NedMalloc为我工作正常,我就失去了动力。
除了上面提到的两个之外,我认为尝试TCMalloc也很有意思 - 它有一些听起来比NedMalloc理论上更好的特性(比如用于小分配的开销很小,相比之下使用的是4 B头由NedMalloc提供,但由于它似乎没有准备好Windows端口,它可能也会变得非常简单。
使用NedMalloc几周后,我不得不放弃它,因为它的空间开销已经证明对我们来说太高了。特别打击我们的是NedMalloc似乎正在回收它不再以不良方式用于操作系统的内存,保持大部分内容仍然存在。现在我用JEMalloc替换它,它似乎不是那么快(它仍然很快,但没有NedMalloc那么快),但它以这种方式非常强大,并且它的可扩展性也非常好
使用JEMalloc几个月后,我改用了TCMalloc。与其他产品相比,它需要花费更多的精力来适应Windows,但它的结果(性能和碎片)似乎对我们迄今为止所测试的最好。
答案 1 :(得分:4)
过去我需要一种非常快速的方法来分配内存。我发现没有一个可以胜任工作的分配。
经过几天的搜索,我发现了boost :: pool,我们在应用程序中的性能提升了300倍。
我们只是在我们想要创建的对象上调用malloc / free。虽然设置开销很小,但必须首先使用大量内存,但是一旦完成,这非常快。
答案 2 :(得分:1)
我在前面遇到多线程争用和严重的碎片问题时试图走上你的道路。在完全测试后,我得出结论,在我遇到的大多数有趣案例中,这些分配器的好处可以忽略不计。
真正的解决方案是拉我自己的内存管理器,专门负责我最常做的任务。
答案 3 :(得分:1)
如果您使用的是Win32,我的经验是,如果您使用HeapSetInformation API启用低碎片堆,则很难击败常规Windows堆管理器。我相信这现在是新版Windows的标准配置。它使用Interlocked * Win32原语处理锁定,而不是更简单的Mutex / CritSec锁定。