您现在的位置是:首页 >学无止境 >windows下源码编译和使用TCMalloc网站首页学无止境

windows下源码编译和使用TCMalloc

itas109 2023-06-28 09:19:01
简介windows下源码编译和使用TCMalloc

windows下源码编译和使用TCMalloc

环境:

OS: windows 10
编译器:vs2019
cmake: 3.22.1
tcmalloc: gperftools-2.10

前言

TCMalloc是Google开发的专用于多线程系统设计的内存分配器。如mysql、Nginx、Redis 高并发下的性能和内存优化等。

在一台2.8GHz的P4机器上执行一次小对象malloc及free,TCMalloc需要50纳秒,而glibc 2.3的malloc(ptmalloc2)需要300纳秒。

TCMalloc是google-perftools工具(TCMalloc、heap-checker、heap-profiler和cpu-profiler)之一。

完整的TCMalloc包含了heap-checker和heap-profiler功能,如果不需要这些功能,可以使用 tcmalloc_minimal。

程序中引入TCMalloc后,会自动替代系统的内存分配相关的malloc、free,new,delete等函数。

1. TCMalloc源码编译

wget https://github.com/gperftools/gperftools/archive/refs/tags/gperftools-2.10.tar.gz

解压后用vs打开gperftools.sln,修改编译方式:

  • Debug:Debug版本动态库
  • Release-Patch:Release版本动态库
  • Release-Override:Release版本静态库

生成结果

$ tree
.
|-- Debug
|   |-- libtcmalloc_minimal.dll
|   |-- libtcmalloc_minimal.exp
|   |-- libtcmalloc_minimal.lib
|   `-- libtcmalloc_minimal.pdb
|-- Release-Override
|   |-- libtcmalloc_minimal.lib
|   `-- libtcmalloc_minimal.pdb
`-- Release-Patch
    |-- libtcmalloc_minimal.dll
    |-- libtcmalloc_minimal.exp
    |-- libtcmalloc_minimal.lib
    `-- libtcmalloc_minimal.pdb

2. TCMalloc的使用

2.1 CMake方式

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

project(main)

link_directories(.)

add_executable(${PROJECT_NAME} main.cpp)

target_link_options(${PROJECT_NAME} PRIVATE /INCLUDE:_tcmalloc)
target_link_libraries(${PROJECT_NAME} libtcmalloc_minimal)

2.2 手动添加到Vistual Studio

【项目】 -> 【属性】 -> 【链接器】 -> 【输入】 -> 【附加依赖项】 -> libtcmalloc_minimal.lib
【项目】 -> 【属性】 -> 【链接器】 -> 【输入】 -> 【强制符号引用】 -> _tcmalloc

3. 测试

main.cpp

#include <stdio.h>
#include <windows.h> // GetTickCount64 malloc

int main()
{
	const int COUNT = 1000 * 10000;// 1000w
	ULONGLONG start = GetTickCount64();
	for (int i = 0; i < COUNT; ++i)
	{
		char* str = (char*)malloc(1025);
		free(str);
	}
	printf("time: %llums
", GetTickCount64() - start);

	return 0;
}

结果:

  • TCMalloc: 78ms
  • 系统malloc:437ms

Reference:

  1. gperftools
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。