C ++内存分配机制性能比较(tcmalloc与jemalloc)

我有一个分配大量内存的应用程序,我正在考虑使用比malloc更好的内存分配机制。

我的主要选项是:jemalloc和tcmalloc。 使用其中的任何一个有什么好处?

在http://locklessinc.com/benchmarks.shtml中有一些机制(包括作者的专有机制 - 无锁)之间有很好的比较,它提到了它们每个的一些优缺点。

鉴于这两种机制都很活跃并不断改进。 有没有人对这两者的相对表现有任何洞察或经验?


如果我没有记错,主要区别在于多线程项目。

这两个库都试图通过让线程从不同的缓存中获取内存来获取去争用内存,但他们有不同的策略:

  • jemalloc (由Facebook使用)每个线程维护一个缓存
  • tcmalloc (来自Google)维护一个缓存池,线程为缓存产生“自然”亲和力,但可能会改变
  • 如果我没有记错的话,这再一次导致了线程管理的重要差异。

  • 如果线程是静态的, jemalloc速度更快,例如使用池
  • 线程创建/销毁时, tcmalloc速度更快
  • 还有一个问题是,由于jemalloc旋转新的缓存以容纳新的线程ID,突然出现线程将在随后的冷静阶段留下(大部分)空闲缓存。

    因此,我会在一般情况下推荐使用tcmalloc ,并保留jemalloc用于非常特定的用法(应用程序生命周期中线程数量的变化较小)。


    我最近在工作中考虑了tcmalloc。 这是我观察到的:

  • 在多线程环境中大量使用malloc的性能大大提高。 我在工作中使用了它,性能几乎提高了两倍。 原因是在这个工具中有几个线程在关键循环中执行小对象的分配。 使用glibc,性能会受到影响,因为我认为会锁定不同线程中malloc / free调用之间的争用。

  • 不幸的是,tcmalloc增加了内存占用。 我上面提到的工具会消耗两到三倍的内存(以最大驻留集大小衡量)。 由于我们实际上在寻找减少内存占用的方法,增加的占用空间对我们来说是不可行的。

  • 最后,我决定不使用tcmalloc,而是直接优化应用程序代码:这意味着从内部循环中删除分配以避免malloc / free锁争用。 (为了好奇,使用一种压缩形式而不是使用内存池。)

    对你来说,教训是你应该用典型的工作量仔细衡量你的应用程序。 如果你可以承担额外的内存使用,tcmalloc可能对你很好。 如果不是这样,tcmalloc仍然可以通过避免频繁调用线程间内存分配来获得更多的收益。


    请注意,根据'nedmalloc'主页,现代操作系统的分配器现在非常快速:

    “Windows 7,Linux 3.x,FreeBSD 8,Mac OS X 10.6都包含最先进的分配器,并且没有第三方分配器可能会在真实世界的结果中显着改善它们”

    http://www.nedprod.com/programs/portable/nedmalloc

    所以你可能只能推荐你的用户升级或类似的东西:)

    链接地址: http://www.djcxy.com/p/78489.html

    上一篇: C++ memory allocation mechanism performance comparison (tcmalloc vs. jemalloc)

    下一篇: Dynamic allocation of 'string' arrays