使用的mingw: i686-8.1.0-release-posix-dwarf-rt_v6-rev0
tcmalloc: gperftools2.7覆盖gperftools2.5
msys2: 20180531,这个看起来不重要
1)github上,官方的gperftools已经是2.7,但是没有带configure文件,github上还有另外2个非官方tcmalloc,版本2.5,其中一个带configure文件。用2.7覆盖2.5,得到最终版本。2.5的也能用,就是有另外的编译错误要处理。
2)msys里执行./configure
3)修改makefile:CFLAG/CXXFLAGS由-g -O2改为-O3 -DPERFTOOLS_DLL_DECL=
4)preamble_patcher_with_stub.cc注释掉这个保护,看起来很恐怖,但是实际运行还没出错。由天命了。谁知道更好答案请告诉我啦,谢!
} else if (IT_RETURN == instruction_type) {
// SIDESTEP_ASSERT(false &&
// "Unable to patch because function is too short");
// return SIDESTEP_FUNCTION_TOO_SMALL;
5) tcmalloc.h里 #if @ac_cv_have_std_align_val_t@ && __cplusplus >= 201703L去掉2个@字符
6)make
7)使用项目:
在main函数或最早运行的函数所在文件#include <tcmalloc.h>
并且在尽可能早的地方加全局变量:void * makeTCMallocUsed = tc_malloc(4);
编译参数加:-DPERFTOOLS_DLL_DECL=
链接参数加:-ltcmalloc_minimal -lpsapi
附加: 确认起效方法:thread_cache.h ThreadCache::Allocate函数里加点log输出。
总体来说,内存分配密集型多线程程序,总运行时间有望加快10%