google-perftools简介google-perftools是一款针对C/C++程序的性能剖析工具linux c语言小程序,它是一个遵循BSD合同的开源项目。使用该工具可以对CPU时间片、内存等系统资源的分配和使用进行剖析,本文将重点介绍怎样进行CPU时间片的解读。google-perftools对一个程序的CPU性能分析包括以下几个步骤。1.编译目标程序,加入对google-perftools库的依赖。2.运行目标程序,并用某种方法启动/中止分析函数并形成分析结果。3.运行剖结果转换工具linux web服务器,将不可读的结果数据转化成某种格式的文档(比如pdf,txt,gv等)。安装您可以在google-perftools的网站()上下载最新版的安装包。为完成步骤3的工作,您还须要一个将分析结果转化为程序员可读文档的工具,比如gv()。编译与运行您须要在原有的编译选项中加入对libprofiler.so的引用,这样在目标程序运行时会加载工具的动态库。诸如本例中作者的系统中,libprofiler.so安装在"/usr/lib"目录下linux c语言小程序,所以须要在makefile文件中的编译选项加入“-L/usr/lib-lprofiler”。
google-perftools须要在目标代码的开始和结尾点分别调用分析模块的启动和中止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的CPU时间片进行统计和剖析。工具的启动和中止可以采用以下两种形式。a.使用调试工具gdb在程序中自动运行性能工具的启动/中止函数。gdb是Linux上广泛使用的调试工具sogou pinyin linux,它提供了强悍的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照,本文少将只对用到的几个基本功能进行简单介绍。使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。命令功能ctrl+c暂停程序的运行c继续程序的运行b添加函数断点(参数可以是源代码中的行号或则一个函数名)p复印某个量的值或则执行一个函数调用b.在目标代码中直接加入性能工具函数的调用,该方式就是在程序代码中直接加入调试函数的调用。两种形式都须要对目标程序重新编译,加入对性能工具的库依赖。对于后者,他的用处是使用比较灵活,但工具的启动和中止依赖于程序员的自动操作,往往须要一些暂停函数(例如休眠sleep)的支持能够达到控制程序的目的,因而精度可能遭到影响。
对于前者,它须要对目标代码的进行更改,须要处理函数申明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都须要重新编译,灵活度不高,读者可以依照自己的实际需求采用有效的形式。示例解读该程序是一个简单的事例,文中有两处历时的无用操作,而且两者间有一定的调用关系。清单1.示例程序voidconsumeSomeCPUTime1(intinput){inti=0;input++;while(i++<10000){i--;i++;i--;i++;}};voidconsumeSomeCPUTime2(intinput){input++;consumeSomeCPUTime1(input);inti=0;while(i++<10000){i--;i++;i--;i++;}};intstupidComputing(inta,intb){inti=0;while(i++<10000){consumeSomeCPUTime1(i);}intj=0;while(j++<5000){consumeSomeCPUTime2(j);}returna+b;};intsmartComputing(inta,intb){returna+b;};voidmain(){inti=0;printf("reachedthestartpointofperformancebottleneckn");sleep(5);//ProfilerStart("CPUProfile");while(i++MyProfile.pdf转换后形成的结果文档如右图。
图中的数字和框体的大小代表了的某个函数的运行时间占整个分析时间的比列。由代码的逻辑可知,stupidComputing,stupidComputing2都是费时操作而且它们和consumeSomeCPUTime存在着一定的调用关系。图1.分析结果结束语本文介绍了一个Linux平台上的性能分析工具google-perftools,并结合实例向读者展示了怎样使用该工具配置、使用及剖析性能困局。