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

Sha*_*oya 24 c++ linux malloc tcmalloc

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

我的主要选择是:jemalloc和tcmalloc.使用它们中的任何一个是否有任何好处?

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

鉴于这两种机制都是积极的并且不断改进.有没有人对这两者的相对表现有任何见解或经验?

Mat*_* M. 37

如果我没记错的话,主要区别在于多线程项目.

两个库都试图通过让线程从不同的缓存中选择内存来解除内存获取,但它们有不同的策略:

  • jemalloc (由Facebook使用)维护每个线程的缓存
  • tcmalloc (来自谷歌)维护一个缓存池,线程为缓存开发"自然"亲和力,但可能会改变

如果我没记错的话,这导致了线程管理方面的重要区别.

  • jemalloc 如果线程是静态的,则更快,例如使用池
  • tcmalloc 线程创建/销毁时速度更快

还有一个问题是,由于jemalloc旋转新缓存以容纳新的线程ID,突然出现线程突然将在随后的平静阶段留下(大部分)空缓存.

因此,我建议tcmalloc在一般情况下,并保留jemalloc非常具体的用法(在应用程序的生命周期中线程数量的变化很小).


小智 11

我最近考虑过tcmalloc用于工作中的项目.这是我观察到的:

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

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

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

您的教训是,您应该使用典型的工作负载仔细测量您的应用程序.如果你能负担额外的内存使用量,tcmalloc对你来说可能很棒.如果没有,tcmalloc仍然有用,可以避免频繁调用跨线程的内存分配,从而了解您将获得的收益.


rog*_*ack 5

请注意,根据“nedmalloc”主页,现代操作系统的分配器现在实际上非常快:

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

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

因此,您可能只需推荐您的用户升级或类似的东西就可以逃脱:)