I have an application which allocates lots of memory and I am considering using a better memory allocation mechanism than malloc.
My main options are: jemalloc and tcmalloc. Is there any benefits in using any of them over the other?
There is a good comparison between some mechanisms (including the author's proprietary mechanism -- lockless) in http://locklessinc.com/benchmarks.shtml and it mentions some pros and cons of each of them.
Given that both of the mechanisms are active and constantly improving. Does anyone have any insight or experience about the relative performance of these two?
If I remember correctly, the main difference was with multi-threaded projects.
Both libraries try to de-contention memory acquire by having threads pick the memory from different caches, but they have different strategies:
jemalloc
(used by Facebook) maintains a cache per threadtcmalloc
(from Google) maintains a pool of caches, and threads develop a "natural" affinity for a cache, but may changeThis led, once again if I remember correctly, to an important difference in term of thread management.
jemalloc
is faster if threads are static, for example using poolstcmalloc
is faster when threads are created/destructedThere is also the problem that since jemalloc
spin new caches to accommodate new thread ids, having a sudden spike of threads will leave you with (mostly) empty caches in the subsequent calm phase.
As a result, I would recommend tcmalloc
in the general case, and reserve jemalloc
for very specific usages (low variation on the number of threads during the lifetime of the application).