性能分析工具gprof应用详细介绍
性能测试工具gprof & gprof2dot&dot
让程序飞 之 性能工具:gprof & gprof2dot /2011/01/gprof/linux 服务端编程,性能总是不可避免要思考的问题。
而单机(严格的说是单核)单线程程序(严格的说是逻辑)又是所有复杂应用的基础。
所以,这块的性能是整个应用的基础。
当遇到应用相应很慢的时候我们往往会疑问:这么强劲的CPU 到底在干什么,反应这么慢。
满足你!linux 下常用的性能工具就是跟gcc 一起的gprof 。
来个例子程序: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #include <stdio.h>#include <stdlib.h>void f1() {int i;int *p;for (i = 0; i < 10; i++) {p = malloc(sizeof(int));*p = 10;free(p);}}void f2() {int i;int *p;for (i = 0; i < 20; i++) {p = malloc(sizeof(int));*p = 10;free(p);}}void f3() {int i;int *p;for (i = 0; i < 30; i++) {p = malloc(sizeof(int));*p = 10;free(p);}}int main() {int i;37 38 39 40 41 42 43 44 for (i = 0; i < 1000000; i++) { f1();f2();f3();}return 0;}哈哈,好烂的程序啊。
我们现在要通过gprof 找出这个程序运行时cpu 都用来干什么了。
要启用gprof 很简单,gcc 编译的时候带上-pg 参数即可:1 g cc -g -pg test.c -o test下面运行./test 。
profr 0.3.3 性能分析工具文档说明书
Package‘profr’October14,2022Title An Alternative Display for Profiling InformationVersion0.3.3Description An alternative data structure and visual renderingfor the profiling information generated by Rprof.License MIT+file LICENSEURL https:///hadley/profrBugReports https:///hadley/profr/issuesImports plyr,stringrSuggests ggplot2Encoding UTF-8LazyData trueRoxygenNote6.1.1NeedsCompilation noAuthor Hadley Wickham[aut,cre]Maintainer Hadley Wickham<******************>Repository CRANDate/Publication2018-12-0523:40:03UTCR topics documented:ggplot.profr (2)parse_rprof (2)plot.profr (3)profr (4)sample-data (5)Index612parse_rprofggplot.profr Visualise profiling data with ggplot2.Visualise profiling data stored ina profr data.frame.DescriptionThis will plot the call tree of the specified stop watch object.If you only want a small part,you will need to subset the objectUsageggplot.profr(data,...,minlabel=0.1,angle=0)Argumentsdata profile output to plot...other arguments passed on to ggplotminlabel minimum percent of time for function to get a labelangle function label angleSee Alsoplot.profrExamplesif(require("ggplot2")){ggplot(nesting_prof)ggplot(reshape_prof)}parse_rprof Parse Rprof output.DescriptionParses the output of Rprof into an alternative format described in profr.This produces aflat data frame,which is somewhat easier to summarise and visualise.Usageparse_rprof(path,interval=0.02)plot.profr3Argumentspath path to Rprof outputinterval real-time interval between samples(in seconds)Valuedata.frame of class profrSee Alsoprofr for profiling and parsingExamplesnesting_ex<-system.file("samples","nesting.rprof",package="profr")nesting<-parse_rprof(nesting_ex)reshape_ex<-system.file("samples","reshape.rprof",package="profr")diamonds<-parse_rprof(reshape_ex)plot.profr Visualise profiling data with base graphics.Visualise profiling datastored in a profr data.frame.DescriptionIf you only want a small part of the total call tree,you will need to subset the object as demonstrated by the example.Usage##S3method for class profrplot(x,...,minlabel=0.1,angle=0)Argumentsx profile output to plot...other arguments passed on to plot.defaultminlabel minimum percent of time for function to get a labelangle function label angleSee Alsoggplot.profrExamplesplot(nesting_prof)plot(reshape_prof)4profr profr Profile the performance of a function call.DescriptionThis is a wrapper around Rprof that provides results in an alternative data structure,a data.frame.The columns of the data.frame are:Usageprofr(expr,interval=0.02,quiet=TRUE)Argumentsexpr expression to profileinterval interval between samples(in seconds)quiet should output be discarded?Detailsf name of functionlevel level in call stacktime total time(seconds)spent in functionstart time at which control entered functionend time at which control exited functionleaf TRUE if the function is a terminal node in the call tree,i.e.didn’t call any other functions source guess at the package that the function came fromValuedata.frame of class profrSee Alsoparse_rprof to parse standalone Rproffile,plot.profr and ggplot.profr to visualise the pro-filing dataExamples##Not run:glm_ex<-profr({Sys.sleep(1);example(glm)},0.01)head(glm_ex)summary(glm_ex)plot(glm_ex)##End(Not run)sample-data5 sample-data Sample profiling datasetsDescriptionThese two datasets illustrate the results of running parse_rprof on the sample Rprof output stored in the samples directory.The output was generated by the code in samples/generate.r.Usagenesting_profreshape_profFormata data frameIndex∗datasetssample-data,5∗debuggingparse_rprof,2profr,4∗hplotggplot.profr,2plot.profr,3data.frame,3,4ggplot,2ggplot.profr,2,3,4nesting_prof(sample-data),5parse_rprof,2,4,5plot.default,3plot.profr,2,3,4profr,2,3,4reshape_prof(sample-data),5Rprof,2–5sample-data,56。
ctool程序开发常用工具用法
ctool程序开发常用工具用法在C语言程序开发中,有许多工具可以提高开发效率、调试程序以及进行性能优化。
以下是一些常用的C语言开发工具及其用法,供参考:1.编译器(gcc):-用法:`gcc source.c-o output`-说明:用于编译C源代码,生成可执行文件。
可以通过参数`-o`指定输出文件名。
2.调试器(gdb):-用法:`gdb executable`-说明:用于调试程序,支持设置断点、查看变量值等操作。
3.性能分析器(gprof):-用法:`gprof executable`-说明:用于分析程序的性能,生成函数调用关系和运行时间统计。
4.动态分析工具(Valgrind):-用法:`valgrind--leak-check=full executable`-说明:用于检测内存泄漏和执行时错误,提供详细的报告。
5.版本控制工具(Git):-用法:`git init`,`git add`,`git commit`,等-说明:用于版本控制,追踪代码变更,支持多人协作。
6.构建工具(Make):-用法:`make target`-说明:用于自动化构建,管理项目中的编译、链接等任务。
7.静态代码分析工具(Cppcheck):-用法:`cppcheck source.c`-说明:用于检查代码中的潜在问题,如未定义的变量、内存泄漏等。
8.文档生成工具(Doxygen):-用法:`doxygen config_file`-说明:用于自动生成代码文档,包括函数、变量的说明和关系图。
9.单元测试框架(Check、Unity):-用法:根据框架不同,编写测试用例和运行测试。
-说明:用于进行单元测试,确保代码的功能正常。
10.交叉编译工具链:-用法:根据目标平台选择相应的交叉编译工具链。
-说明:用于在一个平台上为另一个平台生成可执行文件。
这些工具可以根据具体项目需求选择使用,能够提高开发效率、代码质量和程序性能。
C调试各种方法 调试工具
调试工具之一gprof(2008-04-29 12:49:03)转载▼分类:理财标签:杂谈调试工具之一gprof一、用途:主要用于性能测试二、功能:分析程序中每个函数的调用次数,每个函数消耗处理器的时间,函数调用关系和与源代码的对应三、原理:编译器编译时在每个函数的入口和出口加入profiling代码,四、用法:编译时加-pg参数五、举例:以arm嵌入式为例1.程序如下void test1(){}main(){test1();test1();test1();}2.在普通PC上编译arm-linux-gcc main.c –o test –pg3.拷到arm板上运行./test运行后同目录下生成gmon.out4.看profiling信息在PC上运行:gprof test就能看到信息了,kprof也可以用六、参考:/juventus/blog/item/312dd42a0faf169b033bf6ff.html调试工具之二backtrace(2008-04-29 16:01:27)转载▼标签:杂分类:算法与调试谈调试工具之二backtrace一.用途:主要用于程序异常退出时寻找错误原因二.功能:回溯堆栈,简单的说就是可以列出当前函数调用关系三.原理:1.通过对当前堆栈的分析,找到其上层函数在栈中的帧地址,再分析上层函数的堆栈,再找再上层的帧地址……一直找到最顶层为止,帧地址指的是一块:在栈上存放局部变量,上层返回地址,及寄存器值的空间。
2.由于不同处理器堆栈方式不同,此功能的具体实现是编译器的内建函数__buildin_frame_address及__buildin_return_address中,它涉及工具glibc和gcc,如果编译器不支持此函数,也可自己实现此函数,举例中有arm上的实现四.方法:在程序中加入backtrace及相关函数调用五.举例:1.一般backtrace的实现i.程序#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <execinfo.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <string.h>#include <unistd.h>#define PRINT_DEBUGstatic void print_reason(int sig, siginfo_t * info, void*secret){void *array[10];size_t size;#ifdef PRINT_DEBUGchar **strings;size_t i;size = backtrace(array, 10);strings = backtrace_symbols(array, size);printf("Obtained %zd stack frames.\n", size); for (i = 0; i < size; i++)printf("%s\n", strings[i]);free(strings);#elseint fd = open("err.log", O_CREAT | O_WRONLY); size = backtrace(array, 10);backtrace_symbols_fd(array, size, fd);close(fd);#endifexit(0);}void die(){char *test1;char *test2;char *test3;char *test4 = NULL;strcpy(test4, "ab");}void test1(){die();}int main(int argc, char **argv){struct sigaction myAction;myAction.sa_sigaction = print_reason;sigemptyset(&myAction.sa_mask);myAction.sa_flags = SA_RESTART | SA_SIGINFO; sigaction(SIGSEGV, &myAction, NULL);sigaction(SIGUSR1, &myAction, NULL);sigaction(SIGFPE, &myAction, NULL);sigaction(SIGILL, &myAction, NULL);sigaction(SIGBUS, &myAction, NULL);sigaction(SIGABRT, &myAction, NULL);sigaction(SIGSYS, &myAction, NULL);test1();}ii.编译参数gcc main.c -o test -g -rdynamic2.根据不同的处理器自已实现backtracei.arm的backtrace函数实现static int backtrace_xy(void **BUFFER, int SIZE){volatile int n = 0;volatile int *p;volatile int *q;volatile int ebp1;volatile int eip1;volatile int i = 0;p = &n;ebp1 = p[4];eip1 = p[6];fprintf(stderr, "======================= backtrace_xyaddr: 0x%0x, param1: 0x%0x, param2: 0x%0x\n",backtrace_xy, &BUFFER, &SIZE);fprintf(stderr, "n addr is 0x%0x\n", &n);fprintf(stderr, "p addr is 0x%0x\n", &p);for (i = 0; i < SIZE; i++){fprintf(stderr, "ebp1 is 0x%0x, eip1 is 0x%0x\n",ebp1, eip1);BUFFER[i] = (void *)eip1;p = (int*)ebp1;q = p - 5;eip1 = q[5];ebp1 = q[2];if (ebp1 == 0 || eip1 == 0)break;}fprintf(stderr, "total level: %d\n", i);return i;}一般情况下这样就可以使用了, 若想得到arm堆栈的具体实现, 请查看<调试工具之三arm堆栈与汇编(backtrace续)>由于msn space限制文章长度, 只好分开写了调试工具之三arm堆栈与汇编(backtrace续)(2008-04-29 16:04:08)转载▼分类:算法与调试标签:杂谈调试工具之三arm堆栈与汇编(backtrace续)一.可能会影响堆栈的因素1.原理i.通常情况下,栈向下(低地址)增长,每向栈中PUSH一个元素,栈顶就向低地址扩展,每从栈中POP一个元素,栈顶就向高地址回退。
gprof使用详细介绍
gprof使用详细介绍linux下c/c++编程gprof介绍gprof是GNU profiler工具。
可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。
也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。
还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。
基本用法:1.使用-pg选项编译和链接你的应用程序。
2.执行你的应用程序,使之运行完成后生成供gprof分析的数据文件(默认是gmon.out)。
3.使用gprof程序分析你的应用程序生成的数据,例如:gprof a.out gmon.out。
举例gcc -Wall -pg -o test test.c//程序文件名称test.c 编译时使用-pg现在我们可以再次运行test,并使用我们前面使用的测试数据。
这次我们运行的时候,test运行的分析数据会被搜集并保存在'gmon.out'文件中,我们可以通过运行' gprof test '来查看结果。
./testgprof testgprof 实现原理:gprof并不神奇,在编译和链接程序的时候(使用-pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount(or“_mcount”, or“__mcount”)的函数,也就是说-pg编译的应用程序里的每一个函数都会调用mcount, 而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。
这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
程序运行结束后,会在程序退出的路径下生成一个gmon.out文件。
这个文件就是记录并保存下来的监控数据。
可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。
另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a 库,才可以产生库函数的profiling信息。
C_C++优化工具gprof使用说明.v100.20070430
编写目的简单介绍C/C++代码优化工具gprof供公司内部交流使用;Gprof简介gprof是GNU profiler工具。
GProf 使用了一种异常简单但是非常有效的方法来优化C/C++ 程序,而且能很容易的识别出值得优化的代码。
Gprof通过记录程序概要分析,提供程序内部各个函数得调用次数,占用时间等等,来帮助我们分析优化我们的程序。
程序概要分析的概念非常简单:通过记录各个函数的调用和结束时间,我们可以计算出程序的最大运行时的程序段。
Gprof详细内容可通过man gprof获取。
使用方法Gprof为编译器自带工具,根据平台及编译器不同,gprof不同,使用方式上会有一些区别,大体上来说大同小异;1.程序编译在程序编译时,需要加入相应的gprof编译选项,目前实验室测试时HP使用–G 选项,COMPAQ使用–pg 选项;IBM使用–pg选项其他平台具体使用编译选项,可以在测试使用的主机上通过man gprof 获取相关信息;单文件编译简单示例:gcc -Wall -g -pg -lc_p example.c -o example2.环境变量配置只有一个环境变量需要配置,程序运行分析概要结果文件存放路径,目前实验室HP需配置GPROFDIR;COMPAQ配置PROFDIR;IBM配置GPROF;GPROF=profile:thread,scale:8,file: multithread,filename:gmon其他平台可以通过man gprof 查看所需配置的环境变量名;若该变量未配置则,程序运行的概要分析结果文件将以默认的路径及文件名存放;配置该变量后概要分析文件以进程ID及进程名称相关的文件名形式生成;如:10880.0.scsubrun3.对概要结果进行分析可通过man gprof 查看相关命令的具体使用方法;如:gprof “进程全路径文件名”“概要分析文件”gprof /usr2/users/sms/cmin02sms/bin/scsubrun 10880.0.scsubrun将对10880.0.scsubrun进行分析得到我们想要的程序运行统计结果;4.程序运行统计结果说明该部分在分一个程序运行统计结果中都会有文件内容的英文说明,这里做下简单的介绍;统计结果分为一下几个部分:a)整体统计结果●内容举例:%time cumulative self calls ms/call ms/call name16.6 0.03 0.03 453873 0.00 0.00 outf [10]15.6 0.06 0.03 61741 0.00 0.00 _ecCursorOpen [7]13.7 0.09 0.03 93846 0.00 0.00 Affair::Logf [8]9.8 0.11 0.02 58005 0.00 0.00 ecSelect [4] 16.6●说明:第一项%time为该函数占用程序运行CPU时间百分比第二项cumulative为列表中前n项的运行时间累计值意义不大,第三项self为函数调用本身占用CPU时间(该时间不包括该函数的子函数调用);第四项calls为函数在程序运行过程中被调用的总次数;第五、六项可以不看,第七项name为函数名;●内容举例说明:如第一行16.6 0.03 0.03 453873 0.00 0.00 outf [10]16.6:Outf占程序运行CPU时间的%16.6;0.03:略;0.03:一次outf调用占用CPU平均时间为0.03s;453873:outf被调用的总次数为453873;0.00:ms/call:略;0.00:ms/call:略;Outf[10]: 函数名为outf(),本次分析中该函数对应的索引为10;b)详细调用清单:●格式说明:called/total parentsindex %time self descendents called+self name indexcalled/total childrenindex:为分析结果中本次分析函数的索引,%time:为该函数占用程序运行CPU时间百分比,self :函数本身消耗的CPU时间,descendents:调用子函数消耗的CPU时间,called/total parents:父函数调用该函数次数/该函数被调用次数父函数名称;called+self name:本次分析函数被调用次数,本次分析函数名称;called/total children:本次分析函数调用子函数次数/子函数被调用总次数,子函数名;index:函数在分析结果中的索引;●内容举例:...0.00 0.00 1/58005 TLibManager::Lo...0.00 0.00 14/58005 autoReconnect [...0.00 0.01 13034/58005 Affair::connect...0.02 0.04 44956/58005 Affair::execSer...[4] 32.8 0.02 0.05 58005 ecSelect [4] ...0.03 0.01 61741/61741 _ecCursorOpen [...0.00 0.00 121061/121061 newRow [38] ...0.00 0.00 121061/121061 _ecCursorNext [...0.00 0.00 61741/132753 outNeeded [84] ...0.00 0.00 61741/61741 _ecCursorClose ...●内容说明:第一行:0.00 0.00 1/58005 TLibManager::Lo...0.00:T LibManager::Lo...调用ecSelect时消耗在ecSelect本省的CPU时间0.00(该时间为平均时间);0.00:T LibManager::Lo...调用ecSelect时消耗在ecSelect调用的子函数上的CPU时间0.00(该时间为平均时间);1/58005:TLibManager::Lo...调用ecSelect一次,ecSelect共被调用58005次;TLibManager::Lo...:父函数名为TLibManager::Lo...第二到第四行同上;第五行:[4] 32.8 0.02 0.05 58005 ecSelect [4][4]:ecSelect在分析结果中的函数索引;32.8:ecSelect占用的程序运行CPU时间百分比(含子函数调用);0.02:ecSelect本省消耗的CPU时间;0.05:ecSelect调用子函数消耗的CPU时间;58005:ecSelect被调用次数;ecSelect [4]:函数名及函数在分析结果中的索引;第六行:0.03 0.01 61741/61741 _ecCursorOpen [...0.03:e cSelect调用ecCursorOpen时消耗在ecCursorOpen本省的时间为0.030.01:ecSelect调用ecCursorOpen时消耗在ecCursorOpen调用子函数的CPU时间为0.01;61741/61741:ecSelect调用ecCursorOpen的次数为61741,ecCursorOpen被调用的总次数为61741,即ecCursorOpen都是被ecSelect调用的;5.总结根据上面的分析结果我们可以找到值得优化的地方1)首先找到消耗CPU时间最多的函数outf ,ecCursorOpen ,Affair::Logf,ecSelect 都是值得尝试去优化的;考虑函数本身是否可以进行优化;2)在无法对outf ,ecCursorOpen ,Affair::Logf,ecSelect进行有效优化时,可以检查调用这些函数的主要父函数进行优化,根据调用的必要性,减少对这些函数的调用次数;3)从程序整体结构上分析,结合分析结果对程序关键处(消耗CPU较多的地方)考虑是否可以通过改变程序结构或流程进行优化;。
程序性能分析与优化实战
程序性能分析与优化实战随着计算机技术的日益发展,企业和个人所面临的计算任务也越来越复杂,其中最重要的问题之一就是程序的性能。
性能分析和优化是一项非常重要的工作,可以帮助程序员更好地理解和优化程序。
本文将介绍一些程序性能分析和优化的实践技巧。
1. 程序性能分析程序性能分析是为了找出程序中潜在的瓶颈,以便优化程序性能。
常用的程序性能分析工具包括Gprof、Valgrind和Perf等,它们都提供了很多详细的性能数据和报告,可以帮助程序员快速定位性能问题的原因。
下面介绍一些常见的性能分析方法。
1.1 Gprof分析GNU Profiler (Gprof)是GNU工具包中的一个分析器,用于分析程序的性能瓶颈。
它使用计数器来记录程序在每个子程序内的运行时间,并生成图形化报告。
以下是使用Gprof进行性能分析的步骤:- 编译源代码时加上-g参数- 运行程序并生成gmon.out文件- 使用Gprof工具分析gmon.out文件1.2 Valgrind分析Valgrind是一个强大的开源工具包,其主要功能是检测程序运行时的内存泄漏和错误。
Valgrind通过模拟CPU执行,可以对程序进行全面的性能分析。
下面是使用Valgrind进行性能分析的步骤:- 编译源代码时加上-g参数和-fno-omit-frame-pointer参数- 运行程序并使用Valgrind工具进行分析1.3 Perf分析Performance Counters for Linux (Perf)是Linux内核中的一个性能分析工具,通过性能事件统计器来记录程序执行过程中的函数调用情况、CPU占用率等信息,可以非常详细地分析程序的性能问题。
以下是使用Perf进行性能分析的步骤:- 使用perf record命令开始记录执行信息- 使用perf report命令查看报告2. 程序性能优化性能优化是为了提高程序的执行效率,减少程序所占用的计算资源。
C语言性能分析与调优工具使用指南
C语言性能分析与调优工具使用指南C语言是一种广泛应用于系统和应用程序开发的编程语言。
然而,在开发过程中,我们经常会面临性能问题,例如程序运行速度慢或者内存占用过高。
为了解决这些问题,我们可以利用性能分析与调优工具来帮助我们定位和改善性能瓶颈。
本文将介绍几种常见的C语言性能分析与调优工具,并提供相应的使用指南。
一、GProfGProf是GNU项目中的一款性能分析工具,它可以统计程序中各个函数的执行时间和调用关系。
使用GProf之前,我们需要通过在编译时添加-g选项来生成可调试信息。
接下来,我们需要在程序入口和结束处分别调用__gcov_flush()和monstartup()函数,并在程序执行过程中夹在我们感兴趣的代码段之前和之后调用monenter()和monexit()函数。
使用完毕后,我们可以通过gprof命令来生成和查看分析报告。
二、ValgrindValgrind是一款强大的开源工具套件,其中的Memcheck工具可以帮助我们检测内存使用错误。
通过在编译时添加-g选项来生成可调试信息,并使用valgrind命令来执行程序。
Valgrind会分析程序的内存使用情况,并在检测到内存错误时输出相关信息,例如内存泄漏和访问非法内存等。
我们可以根据Valgrind的提示进行相应的修复与优化。
三、Intel VTuneIntel VTune是一款专业的性能分析工具,适用于多种编程语言。
它可以提供详细的性能分析数据,如CPU使用率、内存使用率和代码的热点函数等。
使用Intel VTune之前,我们需要在编译时添加-pg选项来生成可调试信息,并通过VTune Amplifier来进行性能分析。
VTune Amplifier会收集程序执行期间的各种信息,并生成相应的报告,包括函数执行时间、函数调用关系图等。
四、GCC内建性能分析工具GCC编译器提供了一些内建的性能分析工具,如-fprofile-arcs和-ftest-coverage选项。
C语言中的性能分析和性能优化技术
C语言中的性能分析和性能优化技术C语言作为一种广泛使用的编程语言,在许多领域中都得到了广泛应用。
然而,在大规模的软件开发过程中,性能问题往往是一个不可避免的挑战。
本文将介绍C语言中的性能分析和性能优化技术,帮助开发人员提高代码的性能。
一、性能分析技术1.1 代码剖析(Code Profiling)代码剖析是一种常用的性能分析技术,通过记录代码的执行时间以及函数调用次数等信息,帮助开发人员了解程序的性能瓶颈所在。
在C语言中,可以使用一些工具来进行代码剖析,比如GNU Profiler (gprof)和valgrind等。
1.2 内存分析(Memory Profiling)除了代码的执行时间,内存使用也是影响程序性能的重要因素。
在C语言中,动态内存的分配和释放往往是需要开发人员特别注意的地方。
通过使用内存分析工具,如valgrind的Massif,可以检测内存泄漏和内存使用过高等问题,从而提高程序的性能。
二、性能优化技术2.1 算法优化在优化程序性能时,首先需要考虑的是算法的选择。
不同算法在处理相同问题时可能具有不同的时间复杂度和空间复杂度。
因此,选择合适的算法可以极大地提高程序的性能。
在C语言中,可以通过分析算法的时间复杂度来选择合适的算法。
2.2 循环优化循环是C语言中常见的结构,也是性能优化的热点。
对于循环的优化,可以考虑减少循环的迭代次数、合并循环、循环展开等技术。
通过对循环的优化,可以减少不必要的计算和内存访问,提高程序的执行效率。
2.3 内存访问优化在C语言中,内存的访问方式对程序的性能有着重要的影响。
合理地使用缓存、减少内存的访问次数和提高内存的局部性是优化程序性能的关键。
此外,了解C语言中的数据结构对内存访问的影响,也是进行内存访问优化的重要一环。
2.4 并行化优化随着多核处理器的普及,将程序并行化成为提高性能的有效手段。
在C语言中,可以使用库函数或者多线程的方式实现并行化。
但是,并行化也需要注意同步和共享资源的问题,避免出现数据竞争和死锁等并发相关的问题。
使用 google-perftools 剖析程序性能瓶颈
google-perftools 简介google-perftools 是一款针对C/C++ 程序的性能分析工具,它是一个遵守BSD 协议的开源项目。
使用该工具可以对CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行CPU 时间片的剖析。
google-perftools 对一个程序的CPU 性能剖析包括以下几个步骤。
1. 编译目标程序,加入对google-perftools 库的依赖。
2. 运行目标程序,并用某种方式启动/ 终止剖析函数并产生剖析结果。
3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如pdf,txt,gv 等)。
安装您可以在google-perftools 的网站(/p/google-perftools/downloads/list) 上下载最新版的安装包。
为完成步骤3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如gv (/software/gv/)。
编译与运行您需要在原有的编译选项中加入对libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。
例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。
google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的CPU 时间片进行统计和分析。
工具的启动和终止可以采用以下两种方式。
a. 使用调试工具gdb 在程序中手动运行性能工具的启动/ 终止函数。
gdb 是Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。
具体的文档请参照/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍。
计算机系统性能评估的性能分析工具
计算机系统性能评估的性能分析工具计算机系统的性能评估对于提高系统的效率和性能至关重要。
为了能够全面准确地评估系统的性能,我们需要使用性能分析工具,通过收集、分析和可视化系统的各项指标来提供详细的性能数据和分析报告。
本文将介绍一些常用的计算机系统性能评估的性能分析工具,以帮助读者更好地了解和利用这些工具。
一、性能监控工具性能监控工具是一类常用的性能分析工具,它们能够在运行时对系统进行实时监控,收集关键指标并提供报告。
其中最为著名的是Nagios和Zabbix。
Nagios是一个开源的网络监控工具,可以监控主机、服务和网络设备的状态,实时收集性能数据,并提供基于Web的可视化界面,方便用户查看和分析系统性能。
Zabbix也是一个开源的网络监控工具,功能类似于Nagios,但比Nagios更为强大和灵活。
它提供了更多监控选项和功能,并支持自定义报警和数据分析。
二、性能测试工具性能测试工具是另一类常用的性能分析工具,它们通过模拟真实的负载场景来测试系统的性能,并提供性能数据和报告。
常见的性能测试工具有JMeter和LoadRunner。
JMeter是一个开源的性能测试工具,主要用于测试Web应用程序的性能。
它可以模拟多种负载情况,收集系统的响应时间和吞吐量等性能指标,并生成相应的报告,帮助开发人员发现系统的瓶颈和优化空间。
LoadRunner是一款商业性能测试工具,功能强大而全面。
它支持多种应用程序的性能测试,包括Web、移动和企业级应用。
LoadRunner 可以模拟高并发场景,通过收集关键指标和分析性能数据,帮助用户更好地评估系统的性能和稳定性。
三、性能分析工具性能分析工具是用于分析系统性能数据的工具,它们能够深入分析性能数据,查找系统瓶颈,并提供相应的优化建议。
常用的性能分析工具有GProf和Perf。
GProf是一个开源的性能分析工具,用于分析C/C++程序的性能。
它可以收集函数级别的性能数据,并生成相应的报告,帮助开发人员找出程序中的性能问题和优化方案。
系统性能分析
系统性能分析在当今科技不断发展的世界中,我们使用各种各样的系统来处理大量的数据和完成特定的任务。
无论是在计算机领域、网络工程还是移动设备上,系统性能的分析变得越来越重要。
系统性能分析为我们理解系统的运行情况、发现潜在问题和提高系统的性能提供了有价值的信息。
本文将介绍系统性能分析的概念、方法和工具,并讨论它在不同领域的应用。
什么是系统性能分析系统性能分析是对系统的整体性能进行评估和优化的过程。
它涉及对系统各个组件、子系统和整个系统的性能进行测量、监控和分析,以了解系统的行为、资源使用情况和瓶颈。
通过系统性能分析,我们可以发现系统的瓶颈,识别性能问题的根本原因,并采取相应的措施来改善系统的性能。
系统性能分析的重要性系统性能分析对于系统的设计、开发和维护过程都非常重要。
首先,它可以帮助我们了解系统的工作情况。
通过对系统的性能进行详细的分析,我们可以获得系统的各种指标和指标,例如响应时间、吞吐量、处理能力等。
这些指标可以帮助我们评估系统的工作是否符合预期,并为系统的优化提供基础。
其次,系统性能分析可以帮助我们找出系统存在的问题和瓶颈。
通过分析系统的性能数据,我们可以确定系统的瓶颈和性能问题的根本原因。
这些问题可能包括硬件资源的限制、软件设计的问题或网络通信的延迟。
通过找出这些问题,我们可以采取相应的措施来改进系统的性能。
最后,系统性能分析还可以帮助我们进行系统的规划和扩展。
通过对系统的性能进行评估和分析,我们可以预测系统未来的工作负载,并采取相应的措施来满足未来的需求。
这可能涉及到增加系统的硬件资源、优化软件算法或重新设计系统架构等。
总之,系统性能分析是一个必不可少的过程,它可以帮助我们了解系统的工作情况、找出存在的问题和瓶颈,并为系统的优化和扩展提供指导。
系统性能分析的方法和工具系统性能分析涉及利用各种方法和工具来测量、监控和分析系统的性能。
下面将介绍几种常用的系统性能分析方法和工具。
测量和监控测量和监控是系统性能分析的基础。
【IT专家】Linux C++程序进行性能分析工具gprof使用入门
本文由我司收集整编,推荐下载,如有疑问,请与我司联系Linux C++程序进行性能分析工具gprof使用入门2016/04/29 0 性能分析工具软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键。
这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是要重点测试版本的性能表现和稳定性的。
对于软件测试过程中发现的性能问题,如何定位有很多的方法。
基本的方法可能是开发者对代码进行review,或者是使用一些工具对代码进行性能分析。
常见的性能分析tuning工具有哪些呢?下面两篇文章做了详细的总结:https://computing.llnl/tutorials/performance_tools/#Considerationsen.wikipedia/wiki/List_ of_performance_analysis_tools在我工作中主要是关于Linux C 程序代码的性能分析,gprof是可用于Linux C 代码性能profiling的工具之一,本文主要讲讲我对gprof的学习和使用过程。
Gprof的基本原理gprof能够让你知道你的代码哪些地方是比较耗时的,哪些函数是被调用次数很多的,并且能够让你一目了然的看到函数与函数之间的调用关系。
gprof是gcc/g 编译器支持的一种性能诊断工具。
只要在编译时加上-pg选项,编译器就会在编译程序时在每个函数的开头加一个mcount函数调用,在每一个函数调用之前都会先调用这个mcount函数,在mcount中会保存函数的调用关系图和函数的调用时间和被调次数等信息。
最终在程序退出时保存在gmon.out文件中,需要注意的是程序必须是正常退出或者通过exit调用退出,因为只要在exit()被调用时才会触发程序写gmon.out文件。
那么,gprof的使用方法主要以下三步: 会用-pg参数编译程序运行程序,并正常退出查看gmon.out文件Gprof使用实例[cpp]view plaincopyprint?#include iostream usingnamespacestd;intadd(inta,intb){returna }intsub(inta,intb){returna-b;}intcall(){std::cout add(1,2) std::endl;std::cout sub(2,4)。
gprof 用法
gprof 用法
gprof是GNU工具集中的一个性能分析工具,它用于分析程序的运行时间和函数调用关系,以帮助开发人员找出需要优化的瓶颈。
使用gprof进行性能分析通常需要以下几个步骤:
1. 在编译时添加-g选项,以便生成调试信息。
例如,使用gcc编译C程序时,可以加上-g选项:`gcc -g program.c -o program`
2. 运行程序,并收集性能数据。
在运行程序时,需要添加-g选项和-p选项,以便生成gmon.out文件,该文件包含了程序执行期间的性能数据:`gprof -pg program`
3. 生成性能报告。
运行完程序后,使用gprof命令生成性能报告:`gprof program`
生成的性能报告中包含了函数调用关系、函数执行时间等信息,可以帮助开发人员分析程序的性能瓶颈和函数调用路径。
此外,gprof还支持一些其他的参数和选项,可以根据具体需求进行使用。
例如,`-b`选项可以输出摘要信息,`-s`选项可以按照函数名称进行排序等。
需要注意的是,gprof只能对可执行文件进行分析,无法直接对动态链接库进行分析。
如果需要对动态链接库进行分析,可以通过在可执行文件的代码中添加测试代码,或者
使用LD_PRELOAD等方式加载动态链接库进行分析。
以上是gprof的基本用法,希望对你有帮助!如果还有其他问题,请随时提问。
google-perf-tools原理
Google Performance Tools(也称为gperf)是Google开发的一种开源性能分析工具,用于测量和分析系统的性能。
它提供了一系列功能,可以帮助开发人员识别和解决性能问题。
Google Performance Tools的原理主要基于以下几个关键概念: 1. 性能测量:gperf通过收集各种性能指标,如CPU使用率、内存使用情况、线程活动等,来衡量系统的性能。
这些指标可以帮助开发人员了解系统的运行状况,并确定潜在的性能瓶颈。
2. 采样:gperf使用采样技术来收集性能数据。
采样是一种通过在关键时刻捕获系统状态来测量性能的方法。
gperf可以定期或实时进行采样,并将样本数据存储在本地或远程存储中,以便后续分析和可视化。
3. 分析和可视化:gperf将收集到的性能数据进行分析和可视化,以帮助开发人员理解系统的性能表现。
它提供了丰富的工具和插件,用于分析和比较不同时间点的性能数据,以及识别性能瓶颈和优化点。
4. 硬件亲和性:gperf具有硬件亲和性,可以在多核处理器上并行运行,从而提高采样速度和性能数据的收集效率。
5. 可扩展性:gperf具有可扩展性,可以处理大规模的性能数据集。
它支持分布式采样和存储,可以扩展到数TB的性能数据。
总的来说,Google Performance Tools的原理是通过采样技术收集性能数据,进行分析和可视化,以帮助开发人员识别和解决性能问题。
它具有强大的性能测量和分析能力,是现代高性能系统不
可或缺的工具之一。
C语言中的性能分析与优化工具
C语言中的性能分析与优化工具在C语言的开发过程中,性能是一个关键问题。
为了提高程序的运行效率和减少资源消耗,开发者需要进行性能分析并对程序进行优化。
为此,C语言提供了一些强大的性能分析与优化工具,本文将介绍其中的几个常用工具。
一、gprofgprof是C语言中最常用的性能分析工具之一。
它可以通过收集程序的执行信息,并生成详细的函数调用图和消耗时间统计,帮助开发者找到程序中的性能瓶颈。
使用gprof需要在编译时添加-g选项,并在程序运行时使用指定的命令行参数来启动分析。
gprof的分析结果可以通过图形化工具进行可视化展示,方便开发者进行优化决策。
二、ValgrindValgrind是一个功能强大的开源工具集,其中包含了多个性能分析与优化工具。
其中最常用的是Memcheck和Cachegrind。
Memcheck可以检测内存泄漏和越界访问等内存错误,提供了详细的报告和堆栈跟踪信息。
Cachegrind可以模拟处理器缓存的行为,帮助开发者找到程序中的缓存命中率低的地方,并做出优化策略。
三、perfperf是Linux系统中的一个性能分析工具。
它可以对CPU和内存等硬件资源进行全面的性能监测,并提供了多种方式进行分析。
perf可以显示函数的调用关系图、CPU周期计数、缓存命中率等信息,帮助开发者深入了解程序的执行情况。
此外,perf还支持基于事件的性能分析,可以根据指定的事件进行分析,比如指令执行数、缓存失效等。
四、gdb虽然gdb主要是一个调试工具,但它也提供了一些性能分析的功能。
通过在程序运行时设置断点和观察点,可以获取程序在不同位置的执行时间和资源消耗情况。
在调试过程中,gdb可以提供一系列的性能分析命令,比如记录函数执行时间、检测内存泄漏、监测系统调用等。
总结C语言中的性能分析与优化工具有很多,本文仅介绍了其中几个常用工具。
使用这些工具可以帮助开发者深入了解程序的性能问题,并针对性地进行优化,提高程序的运行效率和资源利用率。
Go语言性能调优工具面试题解析
Go语言性能调优工具面试题解析Go语言性能调优工具是开发人员在进行Go语言程序性能优化时经常使用的工具。
通过使用这些工具,开发人员可以分析程序的性能瓶颈,并进行相应的优化处理,以提高程序的性能和响应速度。
本文将对几个常用的Go语言性能调优工具进行解析和讲解。
一、pprof工具pprof是Go语言内置的性能分析工具,可以用于分析程序的CPU使用情况、内存使用情况以及阻塞等待情况,并生成相应的性能报告。
开发人员可以通过pprof工具查看程序在不同函数中的CPU占用情况、内存占用情况和调用关系等信息,从而找出程序的性能瓶颈。
使用pprof工具有以下几个步骤:1. 导入pprof包:在Go程序中导入pprof包,以便使用pprof提供的功能。
2. 启动性能分析:在程序中适当的位置调用pprof.StartCPUProfile()函数或pprof.StartCPUProfile()函数,开始对程序进行性能分析。
3. 停止性能分析:在程序执行完相应的逻辑后,调用pprof.StopCPUProfile()函数或pprof.StopCPUProfile()函数,停止性能分析。
4. 生成分析结果:使用pprof提供的命令行工具,生成性能分析结果的报告文件。
5. 分析报告:使用pprof提供的查看工具,查看生成的性能分析报告,分析程序的性能瓶颈并进行优化。
二、go-torch工具go-torch是一个用于生成火焰图的工具,通过火焰图可以直观地展示程序在不同函数间的耗时情况,帮助开发人员找出程序的性能瓶颈。
使用go-torch工具有以下几个步骤:1. 安装go-torch:使用go get命令安装go-torch工具。
2. 生成火焰图:使用go-torch工具对程序进行性能分析,并生成火焰图。
3. 分析火焰图:通过查看生成的火焰图,分析程序在不同函数间的耗时情况,找出性能瓶颈。
4. 优化程序:根据火焰图的分析结果,对程序进行相应的优化操作。
【IT专家】使用gprof进行性能分析时的神秘功能
本文由我司收集整编,推荐下载,如有疑问,请与我司联系使用gprof 进行性能分析时的神秘功能使用gprof 进行性能分析时的神秘功能_L_lock_154[英]Mystery function_L_lock_154 when profiling with gprof When profiling my code, gprof is outputting the following:在分析我的代码时,gprof 输出以下内容:Flat profile:Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 30.69 10.55 10.55 _L_lock_154 16.58 16.255.70 1126059616 0.00 0.00 double_cmp 14.25 21.15 4.90 13737 0.36 0.36 bsdi10.0124.59 3.44 memcpy (to take the 1st few lines only)(仅限前几行)taking the top spot is a function i do not recognise, and neither does google unfortunately.占据榜首位置是我无法识别的功能,不幸的是谷歌也没有。
what could it be - does anyone know? as its taking up the lions share of my time i would be keen to find out.它会是什么- 有谁知道吗?因为它占据了我的时间中的狮子份额,因此我很想知道。
using mikes suggestion for DIY profiling, I see this stack backtrace quite often:使用mikes 建议进行DIY 分析,我经常看到这个堆栈回溯:Program received signal SIGINT, Interrupt.0xb7fff424 in __kernel_vsyscall ()(gdb) bt#0 0xb7fff424 in __kernel_vsyscall ()#1 0x080ada62 in __write_nocancel ()#2 0x080859c1 in _IO_new_file_write ()#3 0x08084b64 in new_do_write ()#4 0x080861ed in _IO_new_do_write ()#5 0x080869c5 in _IO_new_file_overflow ()#6 0x08085f3e in_IO_new_file_xsputn ()#7 0x080c4d54 in vfprintf ()#8 0x080b071c in __fprintf_chk ()#90x0805ec36 in fprint_track_hum ()#10 0x0805efe1 in fprint_hash_tracks ()#11 0x08049c33 in main (argc=22, argv=0xbfffeac4) at harness.c:537 although i don’t see the。
gprof使用详细介绍
gprof使用详细介绍linux下c/c++编程gprof介绍gprof是GNU profiler工具。
可以显示程序运行的“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间。
也可以显示“调用图”,包括函数的调用关系,每个函数调用花费了多少时间。
还可以显示“注释的源代码”,是程序源代码的一个复本,标记有程序中每行代码的执行次数。
基本用法:1.使用-pg选项编译和链接你的应用程序。
2.执行你的应用程序,使之运行完成后生成供gprof分析的数据文件(默认是gmon.out)。
3.使用gprof程序分析你的应用程序生成的数据,例如:gprof a.out gmon.out。
举例gcc -Wall -pg -o test test.c//程序文件名称test.c 编译时使用-pg现在我们可以再次运行test,并使用我们前面使用的测试数据。
这次我们运行的时候,test运行的分析数据会被搜集并保存在'gmon.out'文件中,我们可以通过运行' gprof test '来查看结果。
./testgprof testgprof 实现原理:gprof并不神奇,在编译和链接程序的时候(使用-pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount(or“_mcount”, or“__mcount”)的函数,也就是说-pg编译的应用程序里的每一个函数都会调用mcount, 而mcount会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。
这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
程序运行结束后,会在程序退出的路径下生成一个gmon.out文件。
这个文件就是记录并保存下来的监控数据。
可以通过命令行方式的gprof或图形化的Kprof来解读这些数据并对程序的性能进行分析。
另外,如果想查看库函数的profiling,需要在编译是再加入“-lc_p”编译参数代替“-lc”编译参数,这样程序会链接libc_p.a 库,才可以产生库函数的profiling信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
性能分析工具gprof介绍Ver:1.0变更履历目录1.GPROF介绍 (4)2.使用步骤 (4)3.使用举例 (4)3.1测试环境 (4)3.2测试代码 (4)3.3数据分析 (5)3.3.1flat profile模式 (6)3.3.2call graph模式 (7)4.链接库中的函数 (7)5.使用局限 (8)6.分析示例 (12)1.gprof介绍gprof是GNU profile工具,可以运行于linux、AIX、Sun等操作系统进行C、C++、Pascal、Fortran 程序的性能分析,用于程序的性能优化以及程序瓶颈问题的查找和解决。
通过分析应用程序运行时产生的“flat profile”,可以得到每个函数的调用次数,每个函数消耗的处理器时间,也可以得到函数的“调用关系图”,包括函数调用的层次关系,每个函数调用花费了多少时间。
2.使用步骤1)用gcc、g++、xlC编译程序时,使用-pg参数,如果是aCC 用 -G,如:g++ -pg -o test.exe test.cpp编译器会自动在目标代码中插入用于性能测试的代码片断,这些代码在程序运行时采集并记录函数的调用关系和调用次数,并记录函数自身执行时间和被调用函数的执行时间。
2)执行编译后的可执行程序,如:./test.exe。
该步骤运行程序的时间会稍慢于正常编译的可执行程序的运行时间。
程序运行结束后,会在程序所在路径下生成一个缺省文件名为gmon.out的文件,这个文件就是记录程序运行的性能、调用关系、调用次数等信息的数据文件。
3)使用gprof命令来分析记录程序运行信息的gmon.out文件,如:gprof test.exe gmon.out则可以在显示器上看到函数调用相关的统计、分析信息。
上述信息也可以采用gprof test.exe gmon.out> gprofresult.txt重定向到文本文件以便于后续分析。
3.使用举例3.1测试环境本文提供的样例的测试环境如下:➢Linux server164 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686 i686 i386 GNU/Linux➢gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-47.3)➢GNU gprof 2.15.92.0.23.2测试代码清单 1. 耗时测试应用程序示例int a(void){int i=0,g=0;while(i++<100000){g+=i;}return g;}int b(void){int i=0,g=0;while(i++<400000){g +=i;}return g;}int main(int argc, char** argv){int iterations;if(argc != 2){printf("Usage %s <No of Iterations>\n", argv[0]);exit(-1);}elseiterations = atoi(argv[1]);printf("No of iterations = %d\n", iterations);while(iterations--){a();b();}}这个应用程序包括两个函数:a 和b,它们通过运行不同次数的循环来消耗不同的CPU时间。
main 函数中采用了一个循环来反复调用这两个函数。
函数b中循环的次数是a 函数的 4 倍,因此我们期望通过gprof的分析结果可以观察到大概有20% 的时间花在了 a 函数中,而80% 的时间花在了b 函数中。
3.3数据分析在gcc 编译命令中加上–pg参数即可。
编译方法如下:gcc example1.c -pg -o example1 -O2 -lc在编译好这个应用程序之后,按照普通方式运行这个程序:./example1 50000程序运行完之后,应该会看到在当前目录中新创建了一个文件gmon.out。
3.3.1flat profile模式使用gprof 命令分析gmon.out 文件,如下所示:gprof example1 gmon.out -p-p参数标识“flat profile”模式,在分析结果中不显示函数的调用关系,AIX平台默认此参数有效。
输出以下内容:清单2. flat profile 的结果上面结果中各个列的含义如下:%time 函数以及衍生函数(函数内部再次调用的子函数)所占的总运行时间的百分比cumulative seconds 函数累计执行的时间self seconds 函数执行占用的时间calls 函数的调用次数self ms/call 每一次调用函数花费的时间microseconds,不包括衍生函数的运行时间total ms/call 每一次调用函数花费的时间microseconds,包括衍生函数的运行时间name 函数名称列的含义,在gprof的输出结果中都有详细的说明。
从输出结果中可以看到,正如我们期望的一样,b 函数所花费的时间大概是a 函数所花费的时间的4倍。
很多函数调用(例如printf)在上面的输出结果中都没有出现。
这是因为大部分函数都是在C链接库(libc.so)中,而链接库并没有使用-pg 进行编译,因此就没有对链接库中的函数收集调度信息。
3.3.2call graph模式如果希望反映函数之间的调用关系,需要采用如下命令:gprof example1 gmon.out –q-q参数标识“call graph”模式,在分析结果中显示函数的调用关系。
输出以下内容:清单3. Call graph上面结果中各个列的含义如下:index 每个函数第一次出现时都分配了一个编号,根据编号可以方便的查找函数的具体分析数据%time 函数以及衍生函数(函数内部再次调用的子函数)所占的总运行时间的百分比self 函数的总运行时间children 衍生函数执行的总时间called 函数被调用的次数,不包括递归调用name 函数名称在name列中,可以看出函数之间的调用关系,main函数调用a、b函数,b函数被main函数调用,a函数被main函数调用。
通过函数名称后面的数字来标识这个文件中的函数,从而可以快速定位函数的分析数据的位置,经过一层层的逐步深入的分析就得到各个函数的调用关系以及各个函数的性能数据。
4.链接库中的函数正如在前面曾经介绍的,对于代码剖析的支持是由编译器增加的,因此如果希望从链接库(比如libc.a)中获得剖析信息,就需要使用-pg 来编译这些库。
很多操作系统默认提供了已经启用代码剖析支持而编译的链接库版本,例如:libc.a对应的采用-pg编译的文件为libc_p.a。
对于没有按照标准提供类似libc_p.a链接库的操作系统版本来说,就需要安装已经编译好的启用代码剖析的链接库版本或者自己下载链接库的源代码进行编译。
使用“启用代码剖析的链接库版本”的应用场景,举例如下:gcc example1.c -g -pg -o example1 -O2 -lc_p然后,像普通情况下一样运行gprof对gmon.out进行分析,可以获得flat profile 或call graph,而此时的分析结果会非常丰富,包含很多C的标准库函数的调用信息,例如:printf、write等。
注意:上例的libc_p.a是静态链接库。
gprof目前还不支持对动态链接库中的函数进行性能分析。
5.使用局限gprof的特点是它只能分析应用程序在运行过程中所消耗掉的CPU时间,只有当应用程序的函数消耗CPU的时候,gprof才能够获取函数的性能数据。
如果应用程序在运行过程中暂时挂起,并在系统内核唤醒应用程序后进一步执行,那么在应用程序中间暂停的时间性能数据是无法统计的;而且在应用程序等待I/O操作返回的时间,性能数据也是无法统计的。
如果对清单1 稍加修改,就可以清楚地看出这个问题:清单5. 为清单1 添加sleep()函数调用example2.c:#include <stdio.h>int a(void){sleep(1); /*调用系统函数进行sleep*/return 0;}int b(void){sleep(4); /*调用系统函数进行sleep*/return 0;}int main(int argc, char** argv){int iterations;if(argc != 2){printf("Usage %s <No of Iterations>\n", argv[0]);现在a 函数和b 函数不再处理繁忙的循环了,而是分别调用sleep()来挂起1秒和4秒。
使用“启用代码剖析的链接库版本”,编译这个应用程序:gcc example2.c -g -pg -o example2 -O2 -lc_p并让这个应用程序循环30 次:./example2 30执行gprof example2 gmon.out –p所生成的结果如下:清单6. flat profile 显示了系统调用的结果Flat profile:Each sample counts as 0.01 seconds.no time accumulated% cumulative self self totaltime seconds seconds calls Ts/call Ts/call name0.00 0.00 0.00 21 0.00 0.00 _IO_file_overflow0.00 0.00 0.00 13 0.00 0.00 strncmp0.00 0.00 0.00 8 0.00 0.00 memset0.00 0.00 0.00 8 0.00 0.00 sigprocmask0.00 0.00 0.00 7 0.00 0.00 getenv0.00 0.00 0.00 6 0.00 0.00 memcpy0.00 0.00 0.00 5 0.00 0.00 _int_malloc0.00 0.00 0.00 5 0.00 0.00 malloc0.00 0.00 0.00 5 0.00 0.00 sigaction0.00 0.00 0.00 5 0.00 0.00 strsep0.00 0.00 0.00 4 0.00 0.00 nanosleep0.00 0.00 0.00 4 0.00 0.00 sleep0.00 0.00 0.00 4 0.00 0.00 strpbrk0.00 0.00 0.00 3 0.00 0.00 _IO_new_file_xsputn0.00 0.00 0.00 3 0.00 0.00 ____strtoul_l_internal0.00 0.00 0.00 3 0.00 0.00 __cxa_atexit0.00 0.00 0.00 3 0.00 0.00 __strtoul_internal0.00 0.00 0.00 2 0.00 0.00 __errno_location0.00 0.00 0.00 2 0.00 0.00 __find_specmb0.00 0.00 0.00 2 0.00 0.00 a0.00 0.00 0.00 2 0.00 0.00 b0.00 0.00 0.00 2 0.00 0.00 mempcpy0.00 0.00 0.00 1 0.00 0.00 _IO_default_xsputn0.00 0.00 0.00 1 0.00 0.00 _IO_doallocbuf0.00 0.00 0.00 1 0.00 0.00 _IO_file_doallocate0.00 0.00 0.00 1 0.00 0.00 _IO_file_stat0.00 0.00 0.00 1 0.00 0.00 _IO_file_write0.00 0.00 0.00 1 0.00 0.00 _IO_setb0.00 0.00 0.00 1 0.00 0.00 ____strtol_l_internal0.00 0.00 0.00 1 0.00 0.00 ___fxstat640.00 0.00 0.00 1 0.00 0.00 __init_misc0.00 0.00 0.00 1 0.00 0.00 __libc_csu_fini0.00 0.00 0.00 1 0.00 0.00 __libc_csu_init0.00 0.00 0.00 1 0.00 0.00 __libc_init_first0.00 0.00 0.00 1 0.00 0.00 __libc_init_secure0.00 0.00 0.00 1 0.00 0.00 __libc_setup_tls0.00 0.00 0.00 1 0.00 0.00 __libc_start_main0.00 0.00 0.00 1 0.00 0.00 __pthread_initialize_minimal 0.00 0.00 0.00 1 0.00 0.00 __setfpucw0.00 0.00 0.00 1 0.00 0.00 __strtol_internal0.00 0.00 0.00 1 0.00 0.00 _dl_aux_init0.00 0.00 0.00 1 0.00 0.00 _dl_important_hwcaps0.00 0.00 0.00 1 0.00 0.00 _dl_init_paths0.00 0.00 0.00 1 0.00 0.00 _dl_non_dynamic_init0.00 0.00 0.00 1 0.00 0.00 _itoa_word0.00 0.00 0.00 1 0.00 0.00 _mcleanup0.00 0.00 0.00 1 0.00 0.00 atexit0.00 0.00 0.00 1 0.00 0.00 atoi0.00 0.00 0.00 1 0.00 0.00 exit对以上输出结果进行分析可见,尽管profile 已经记录了每个函数被调用的确切次数,但是为这些函数记录的时间(实际上是所有函数)都是0.00。