在 Windows 和 tcmalloc 愉快的玩耍吧

 

起始

都说使用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

调整项目属性

  1. 添加链接库。在项目->属性->连接器->输入->附加依赖项中添加libtcmalloc_minimal.lib。
  2. 添加强制符号引用。在项目->属性->连接器->输入->强制符号引用中添加__tcmalloc。

已知问题

在使用过程中,或了解过程中发现可能以下问题

  1. 跨越dll的new和delete会崩溃。大概原因是使用静态链接库,每个dll内部都单独进行了内存管理,可以通过更换为动态连接库的tcmalloc解决,见参考资料。
  2. 尽量将tcmalloc应用在主程序上。经过同行传授经验:主程序用tcmalloc的情况下启动时,会第一时间加载tcmalloc的dll,并接管内存分配释放。以下也是同行传授经验,我这里并未实际验证。
    1. 主程序用tcmalloc,dll不用。主程序中new,dll中delete,是OK的。
    2. 主程序用tcmalloc,dll不用。dll中new,主程序中delete,是OK的。
    3. 主程序不用,dll用tcmalloc。主程序中new,dll中delete,是不OK的。
    4. 主程序不用,dll用tcmalloc。dll中new,主程序中delete,是不OK的。
  3. 启用tcmalloc后,会增加3MB左右的内存占用。
  4. 某些情况下,启用tcmalloc会比不启用时占用更多的内存,该状况原因暂时不明确。已经向作者提出问题。 下面是我在一个项目中进行的测试: