用gprof做性能分析

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

gprof (GNU profiler) 是 GNU Binutils 的一员,可以方便的找出程序中各个部分的调用关系和次数。配合其他工具,可以更方便的以图形化展示性能分析结果。

工作流

  1. 编译时添加 -pg 参数
  2. 运行程序
  3. 使用 gprof 处理运行程序后产生的 gmon.out 文件
  4. 分析

一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// example.c
#include <stdio.h>

void foo()
{
return ;
}

void loop(int n)
{
for (auto i = 0; i < n; ++i)
{
foo();
}
}

int main()
{
loop(1000);

return 0;
}

编译、运行

1
2
3
4
g++ -o example -pg example.cpp

# 运行 `./example`,以产生 `gmon.out` 文件
./example

文本化分析

  • gprof ./example gmon.out | less -S
  • 生成 log 文件分析,gprof example gmon.out | tee log.log
1
2
3
4
5
6
7
8
9
10
11
12
13
Flat profile:

Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
41.91 0.05 0.05 100000001 0.00 0.00 foo()
33.53 0.09 0.04 main
25.15 0.12 0.03 1 30.18 80.47 loop(int)

% the percentage of the total running time of the
time program used by this function.
:
[...]

生成 gprof 图

  1. 安装工具:Graphviz,gprof2dot (Python3)
  2. gprof ./example gmon.out | gprof2dot | dot -Tpng -o example.png

gprof

其他工具对比总结

三种Linux性能分析工具的比较_存储之厨的技术博客_51CTO博客

如果碰到一个不太熟悉和了解的系统,我们可以先用 perf(没有源代码的情况)、gprof (有源代码的情况)快速定位热点函数和模块,然后针对热点模块用 stap 进行测量相关函数的具体时间分布。

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

Author

xlindo

Posted on

2022-05-30

Updated on

2023-05-10

Licensed under

Comments