利用 gprof2dot 和graphviz 图形化定位linux c/c++系统性能瓶颈
1 下载
http://code.google.com/p/jrfonseca/wiki/Gprof2Dot 下载gprof2dot.py
http://www.graphviz.org/Download_source.php 下载graphviz-2.18.tar.gz
2 安装
chmod +x gprof2dot.py
tar -xf graphviz-2.18.tar.gz
cd graphviz-2.38.0
./configure
make
make install
3 编译代码
gcc -pg -g -o test test.c
4 执行代码生成gmon.out
./test
file gmon.out
如果gprof ./test:
gmon.out file is missing call-graph data
则表示没有正确的编译选项或者只有一个main函数
5 生成图片
gprof ./test | ./gprof2dot.py -n0 -e0 | dot -Tsvg -o output.svg
gprof2dot默认是部分函数调用图,对性能影响不大的函数调用都不显示,例如上图中没有出现类的构造,析构函数,
如果想要显示全部的函数调用,可以 gprof2dot -n0 -e0 ,默认是n0.5即影响小于5%的函数就不显示了。
当然这样图片会很乱,因为显示内容很多,可以 gprof2dot -n0 -e0 -s
-s表示不显示诸如模板,函数入口参数等等,使得函数名称显示更加精简
gprof这个常用的性能工具,用来性能调优很方便。
但是有个致命的缺点,不能处理动态链接库(dlopen()加载的)。
这时候可以用callgrind
callgrind是valgrind工具集中的一个,使用方便。gcc带上-g参数,然后用callgrind运行
callgrind运行的程序会非常的慢。
运行完之后文件夹下出现了callgrind.out.***便是日志文件,需要用工具查看,
可以在终端用callgrind_annotate查看,也可以用图形前端kcachegrind查看
编译运行:
gcc -o test -g test.c
valgrind --tool=callgrind ./test
/* test.c */
#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;
for (i = 0; i < 1000000; i++) {
f1();
f2();
f3();
}
return 0;
}