最近在linux环境下分析程序的性能,主要应用profile工具集。网上网罗了一些资料,按部就班的进行了一些实验,也得出了一些结果。
其中,用到了valgrind中的memcheck、callgrind。实验了linux自带的gprof 与oprof。最终通过使用callgrind与gprof2dot结合使用,得出程序的调用次数与函数占比等关系图。
以下分享下具体的步骤:
1)首先是环境及工具准备。安装valgrind,下载gprof2dot.py 脚本 ,下载安装graphviz
2)启动运行callgrind。 valgrind --tool=callgrind ./test
3)运行完成后会当前目录下生成callgrind.out.***的文件
4)运行gprof2dot.py -f callgrind callgrind.out.****|dot -Tpng -o report.png 在当前目录下生成report.png
report.png 就是我们希望得到的结果。
下面写了个测试例子:
int b(void) {
int i=0,g=0;
while(i++<400000)
{
// c();
g+=i;
}
return g;
}
int main(int argc, char** argv)
{
int iterations;
if(argc != 2)
{
printf("Usage %s <No of Iterations>\n", argv[0]);
return 0;
}
else
iterations = atoi(argv[1]);
printf("No of iterations = %d\n", iterations);
while(iterations--)
{
a();
b();
}
}
每个方框内部显示函数名称,函数整体包括内部子函数占用时间%比,函数自身,不包括内部子函数占用时间%比,函数执行次数。边表示父函数调用该子函数占用的时间%比,调用次数。从图中可以看出函数占用时间开销,调用次数等开发者。