tcmalloc
与 ptmalloc2
的几个不同的性能指标可以从下图中看出优劣:
在绝大多数情况下, tcmalloc
比 ptmalloc2
更快,特别是对于小分配。 因为在 tcmalloc
内, 线程之间的争用不是什么问题.
tcmalloc
的性能会随着分配大小的增加而下降。 这是因为每线程缓存在达到阈值(默认为 2MB
)时会被垃圾收集。 分配大小越大,在垃圾收集之前可以在缓存中存储的对象就越少。
在最大分配大小约为 32K
时,tcmalloc
的性能明显下降;尺寸越大性能下降得越慢。 因为每线程缓存中对象的最大大小为 32K
; 对于大于此 TCMalloc
的对象,需要向中央页堆中分配。
tcmalloc
比 ptmalloc2
具有更一致的可扩展性 - 线程总数 > 1
时, 它可实现约 700
~ 900
万/秒 的分配操作,适用于小型内存分配; 而对于大内存块则降至约 200
万/秒。这个数值在 ptmalloc2
中则会低得多, 约 400
万/秒 的小内存块分配,大内存块分配则 小于 100
万/秒。
每秒 CPU
时间的操作数(百万次)与线程数,最大分配大小在 64
Bytes - 128
Kbytes 之间:
在这里可以再次看到 tcmalloc
比 ptmalloc
更一致、更高效。 对于最大分配大小 <32K
, tcmalloc
通常可以在大量线程的情况下实现大约 250
万次每秒的CPU
操作时间,而 ptmalloc2
通常只能实现 50
万-100
万次每秒的 CPU
操作时间,很多libc
实现了小于这个数字。 超过 32K
最大分配大小时,tcmalloc
的 CPU
时间会下降到每秒100
万-150
万次操作,而对于大量线程的ptmalloc2
几乎下降到零(即,使用 ptmalloc2
,大量的 CPU
时间被消耗在等待大量线程的锁上)多线程情况)。