|字号 订阅
Google的一个开源项目 google-perftools-2.0 ,网址:
http://code.google.com/p/gperftools/
网上全是拿去优化网络产品的介绍,没找到怎么用在自己的c++项目中。于是自己研究了下,发现挺好玩的。
下载最新的源代码后解压,发现里面有makefile和vc2003的工程文件。手头有codeblocks+cygwin和vc2003、vc2010,就用2003先做测试吧。
打开后发现有个libtcmalloc_minimal和一堆单元测试,libtcmalloc_minimal就是我想要的东东了。
编译这个项目,没错误。发现是个动态库,把编译出的libtcmalloc_minimal.dll libtcmalloc_minimal.lib 拿到测试工程文件夹里。
这个项目文件夹中 google-perftools-1.6/src/windows/google/tcmalloc.h 有个这个头文件,也拿到测试工程源代码里。
工程只要在链接器-》输入-》附加依赖项加入libtcmalloc_minimal.lib就可以了,编译执行,没问题。做测试可以看出没有替换原有的malloc,new,使用了自定义的tc_malloc这样的申请方式,比较下效率:
for(i = 0; i < 100000; i++) { char *p = (char*)malloc(i%1000); free(p); } 用时:0.331秒 占用内存852
for(i = 0; i < 100000; i++) { char *p = (char*)tc_malloc(i%1000); tc_delete(p); } 用时:0.009秒 占用内存1380 (会多用出500K左右的空间)
可以大概看出差距和机制,较多的使用空间来优化时间。(详细的内存性能分析在这个项目的doc中)
平时做项目不喜欢动态库,就想弄个静态库。静态搞起来麻烦一点:
1.把lib项目中 常规-》配置类型改成静态库
2.把 c/c++-》预处理器-》预处理定义中的_USRDLL;去掉
3.重新编译
4.把你的使用这个库的工程中config.h 和 tcmalloc.h中 # define PERFTOOLS_DLL_DECL //__declspec(dllimport) 后面这个注释掉
5.使用工程要
c/c++-》代码生成-》运行时库改成多线程MT(如果是debug就改成多线程调试,这在动态库版本中是不用改的)
6.链接器-》输入-》附加依赖项加入libtcmalloc_minimal.lib(这个是静态版本,比较大4.225MB 囧动态才164 + 54 KB)
7.
链接器-》输入-》忽略指定库中填 libcmt.lib (debug版本libcmtd.lib)
8.这个挺好玩的 - 如果你在程序中没有调用 tc_xxx 这样的函数,那么与libcmt.lib冲突的这个库(也就是tcmalloc静态库)是不被链接到程序中的,程序会出现链接错误而导致程序通不过编译。只要你调用了,程序中的malloc 和 new就相当于被重载(这个用词不官方,就是这个意思)了。很好玩吧~!
9.编译执行
这样你的程序(频繁的申请释放内存)就可以跑得飞快了,这个库也比linux下的要好,linux下的大于128的时候就直接调用原生函数了。
用的时候别忘了google的这个项目是有版权的但的确是免费的,每页源代码上都有版权信息。
让我们的程序跑得更加疯狂吧