gprof:GNU性能分析工具使用与输出解读
请介绍 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(更详细)。
最佳场景:简单单线程程序快速定位热点函数。