首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++内存分配机制性能比较(tcmalloc与jemalloc)

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

Stack Overflow用户
提问于 2011-10-22 00:57:36
回答 6查看 22K关注 0票数 27

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

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

http://locklessinc.com/benchmarks.shtml中的一些机制(包括作者的专有机制--无锁)进行了很好的比较,并指出了每种机制的优缺点。

鉴于这两种机制都是积极的,并不断改进。有没有人对这两者的相对表现有什么见解或经验?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-10-22 01:30:52

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

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

  • jemalloc (由Facebook使用)为每个thread
  • tcmalloc维护一个缓存(来自谷歌)维护一个缓存池,线程对缓存产生一种“自然”的亲和力,但可能会改变

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

如果线程是静态的,则

  • jemalloc更快,例如,当线程为created/destructed

时,使用pools

  • tcmalloc更快

还有一个问题是,因为jemalloc旋转新的缓存来容纳新的线程is,所以突然出现线程峰值将在随后的平静阶段留下(大部分)空的缓存。

因此,我建议在一般情况下使用tcmalloc,并将jemalloc保留用于非常特殊的用途(应用程序生命周期内的线程数量变化较小)。

票数 42
EN

Stack Overflow用户

发布于 2012-06-04 19:21:52

我最近考虑将tcmalloc用于工作中的一个项目。这是我观察到的:

  • 极大地提高了多线程环境中大量使用malloc的性能。我在工作中使用了一个工具,它的性能几乎提高了两倍。原因是在这个工具中,有几个线程在关键循环中执行小对象的分配。使用glibc时,我认为性能会受到影响,因为不同threads.
  • Unfortunately,tcmalloc中的malloc/free调用之间的锁争用增加了内存占用。我上面提到的工具将消耗两到三倍的内存(根据最大驻留集大小来衡量)。增加的内存占用对我们来说是行不通的,因为我们实际上是在寻找减少内存占用的方法。

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

给你的教训是,你应该仔细地用典型的工作负载来衡量你的应用程序。如果您负担得起额外的内存使用量,tcmalloc对您来说可能是个不错的选择。如果不是这样,tcmalloc仍然很有用,可以通过避免频繁地跨线程调用内存分配来查看您将获得什么。

票数 13
EN

Stack Overflow用户

发布于 2013-08-14 06:56:05

请注意,根据'nedmalloc‘主页,现代操作系统的分配器现在实际上是相当快的:

Windows7、Linux3.x、FreeBSD 8、MacOSX10.6都包含最先进的分配器,任何第三方分配器都不可能在实际结果中显著改进它们

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

因此,您可能只需向用户推荐升级或类似的内容即可:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7852731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档