我有一个分配大量内存的应用程序,我正在考虑使用比malloc更好的内存分配机制。
我的主要选项是: jemalloc和tcmalloc。使用它们中的任何一个比使用另一个有什么好处吗?
http://locklessinc.com/benchmarks.shtml中的一些机制(包括作者的专有机制--无锁)进行了很好的比较,并指出了每种机制的优缺点。
鉴于这两种机制都是积极的,并不断改进。有没有人对这两者的相对表现有什么见解或经验?
发布于 2011-10-22 01:30:52
如果我没记错的话,主要区别在于多线程项目。
这两个库都试图通过让线程从不同的缓存中选择内存来解除内存获取的竞争,但它们有不同的策略:
jemalloc (由Facebook使用)为每个threadtcmalloc维护一个缓存(来自谷歌)维护一个缓存池,线程对缓存产生一种“自然”的亲和力,但可能会改变如果我没记错的话,这又一次导致了线程管理方面的重要区别。
如果线程是静态的,则
jemalloc更快,例如,当线程为created/destructed时,使用pools
tcmalloc更快还有一个问题是,因为jemalloc旋转新的缓存来容纳新的线程is,所以突然出现线程峰值将在随后的平静阶段留下(大部分)空的缓存。
因此,我建议在一般情况下使用tcmalloc,并将jemalloc保留用于非常特殊的用途(应用程序生命周期内的线程数量变化较小)。
发布于 2012-06-04 19:21:52
我最近考虑将tcmalloc用于工作中的一个项目。这是我观察到的:
最后,我决定不使用tcmalloc,而是直接优化应用程序代码:这意味着从内部循环中删除分配,以避免malloc/free锁争用。(出于好奇,请使用一种压缩形式,而不是使用内存池。)
给你的教训是,你应该仔细地用典型的工作负载来衡量你的应用程序。如果您负担得起额外的内存使用量,tcmalloc对您来说可能是个不错的选择。如果不是这样,tcmalloc仍然很有用,可以通过避免频繁地跨线程调用内存分配来查看您将获得什么。
发布于 2013-08-14 06:56:05
请注意,根据'nedmalloc‘主页,现代操作系统的分配器现在实际上是相当快的:
Windows7、Linux3.x、FreeBSD 8、MacOSX10.6都包含最先进的分配器,任何第三方分配器都不可能在实际结果中显著改进它们
http://www.nedprod.com/programs/portable/nedmalloc
因此,您可能只需向用户推荐升级或类似的内容即可:)
https://stackoverflow.com/questions/7852731
复制相似问题