mimalloc on CPython
mimalloc is new memory allocator which is optimized for ref-counting languages.

How to use

Install mimalloc

Install mimalloc in ~/local/lib.

$ git clone https://github.com/microsoft/mimalloc.git
$ cd mimalloc
$ vim include/mimalloc-types.h  # enable MI_STAT=2
$ mkdir build
$ cd build
$ cmake .. -D CMAKE_INSTALL_PREFIX=$HOME/local
...
$ make -j8
...
$ make install
-- Install configuration: "Release"
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/libmimalloc.so
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/libmimalloc.a
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/include/mimalloc.h
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/cmake/mimalloc-config.cmake
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/cmake/mimalloc-config-version.cmake
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/cmake/mimalloc.cmake
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/cmake/mimalloc-release.cmake
-- Installing: /home/inada-n/local/lib/libmimalloc.so
-- Installing: /home/inada-n/local/lib/mimalloc-1.0/mimalloc.o

Using mimalloc on CPython

link
The easiest way to link mimalloc is LD_PRELOAD=$HOME/local/lib/libmimalloc.so
You can statically link the mimalloc with LDFLAGS=$HOME/local/lib/mimalloc-1.0/libmimalloc.a too.

Use
mimalloc overrides malloc.  So you can just use PYTHONMALLOC=malloc.


Performance

Benchmark (pyperformance)


$ ./python -m pyperformance run -o pymalloc.json
$ LD_PRELOAD=$HOME/local/lib/libmimalloc.so PYTHONMALLOC=malloc ./python -m pyperformance run -o mimalloc.json --inherit-environ=LD_PRELOAD,PYTHONMALLOC

The mimalloc outperforms the pymalloc on allocation heavy benchmarks.

$ ./python  -m pyperf compare_to pymalloc.json mimalloc.json -G --min-speed=3
Faster (10):
- spectral_norm: 199 ms +- 1 ms -> 182 ms +- 1 ms: 1.10x faster (-9%)
- mako: 23.2 ms +- 0.2 ms -> 21.6 ms +- 0.3 ms: 1.07x faster (-7%)