起始
都说使用tcmalloc可以有效的提高 new 和 delete的效率,所以我要尝试一下~~
了解前因后果,按顺序看。
简单有效直接看 gperftools项目编译tcmalloc。
tcmalloc 的编译
获取tcmalloc代码
首先,我们找到tcmalloc的代码库,然后获取代码~~
https://github.com/google/tcmalloc.git
尝试编译
看文档中的说明并未提到Windows怎么编译,估计会出意外。
按照说明,需要使用Basel编译,这是官网,这是bazel-7.1.2-windows-x86_64的下载连接。
安装后按照说明编译吧~~
大概率不出意外的会出意外。。。
如果跟我一样出问题了看后面,没出问题应该就能得到lib吧,我猜的。
借助gperftools项目编译tcmalloc
gperftools这个工具包包含了很多项目,且默认提供Visual Studio解决方案,其中就包括了tcmalloc项目。
获取gperftools
在gpreftools项目网站中找到发布包,解压到本地即可。
编译项目
打开项目可以看到libtcmalloc_minimal项目,直接编译即可。
该项目Relase的配置,默认为静态链接库形式。
如果需要动态链接库的可以自己调整项目。
使用tcmalloc
调整项目属性
- 添加链接库。在
项目->属性->连接器->输入->附加依赖项中添加libtcmalloc_minimal.lib。 - 添加强制符号引用。在
项目->属性->连接器->输入->强制符号引用中添加__tcmalloc。
已知问题
在使用过程中,或了解过程中发现可能以下问题
- 跨越dll的
new和delete会崩溃。大概原因是使用静态链接库,每个dll内部都单独进行了内存管理,可以通过更换为动态连接库的tcmalloc解决,见参考资料。 - 尽量将
tcmalloc应用在主程序上。经过同行传授经验:主程序用tcmalloc的情况下启动时,会第一时间加载tcmalloc的dll,并接管内存分配释放。以下也是同行传授经验,我这里并未实际验证。- 主程序用
tcmalloc,dll不用。主程序中new,dll中delete,是OK的。 - 主程序用
tcmalloc,dll不用。dll中new,主程序中delete,是OK的。 - 主程序不用,dll用
tcmalloc。主程序中new,dll中delete,是不OK的。 - 主程序不用,dll用
tcmalloc。dll中new,主程序中delete,是不OK的。
- 主程序用
- 启用
tcmalloc后,会增加3MB左右的内存占用。 - 某些情况下,启用
tcmalloc会比不启用时占用更多的内存,该状况原因暂时不明确。已经向作者提出问题。 下面是我在一个项目中进行的测试: