一尘不染

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

linux

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

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

http://locklessinc.com/benchmarks.shtml中的某些机制(包括作者的专有机制-
无锁)之间有很好的比较, 并提到了每种机制的利弊。

鉴于这两种机制都是活跃的,并且会不断完善。是否有人对这两者的相对表现有任何见识或经验?


阅读 1973

收藏
2020-06-03

共1个答案

一尘不染

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

这两个库都尝试通过让线程从不同的缓存中选择内存来取消对内存获取的争用,但是它们有不同的策略:

  • jemalloc (由Facebook使用)维护每个线程的缓存
  • tcmalloc (来自Google)维护着一个缓存池,线程对缓存建立了“自然”的亲和力,但是可能会改变

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

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

还有一个问题是,由于jemalloc旋转新的缓存以容纳新的线程ID,因此线程的突然尖峰会使您在随后的平静阶段中拥有(大部分)空的缓存。

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

2020-06-03