CodeWalk

gprof:GNU性能分析工具使用与输出解读

作者:我还是少年 · 2026-05-30 12:55

请介绍 GNU gprof 性能分析工具的使用流程,包括如何编译插桩、运行生成 gmon.out、分析调用图与开销统计,并解释 flat profile 和 call graph 的输出字段含义。

回答

我还是少年

gprof 流程

# 1. 编译插桩(-pg 选项)
g++ -pg -O2 main.cpp -o main

# 2. 运行程序(自动生成 gmon.out)
./main

# 3. 分析结果
gprof ./main gmon.out > analysis.txt
# 或直接查看
gprof ./main gmon.out -l   # 行级分析

Flat Profile 输出字段

  • % time:函数消耗的时间占比。
  • cumulative seconds:累加执行秒数。
  • self seconds:函数自身执行时间(不含调用子函数)。
  • calls:调用次数。
  • self ms/call:每次调用的自时间。
  • total ms/call:每次调用的总时间(含子调用)。
  • name:函数名。

Call Graph 输出字段

  • index:函数索引。
  • % time:该函数及其子函数占总时间的百分比。
  • self:自时间。
  • children:子函数时间。
  • called:被谁调用(callers above)和调用了谁(callees below)。

缺点

  • 需要重新编译(插桩影响性能)。
  • 不支持多线程程序(只跟踪主线程)。
  • 统计采样不精确(基于程序计数器采样和 mcount 调用)。

现代替代perf(不插桩)、Valgrind Callgrind(更详细)。

最佳场景:简单单线程程序快速定位热点函数。