1. 什么是gprof?
gprof 这是一个GNU的性能分析工具,它是GCC(GNU Compiler Collection,GNU编译器套件)的一部分,与GCC编译器紧密集成。可用于分析程序的函数调用关系和每个函数的运行时间。它通过在编译时插入性能分析代码来收集函数调用信息和执行时间,来帮助开发者识别性能瓶颈。
gprof的优点:
- 可以方便的分析程序的函数调用关系和每个函数的运行时间。
- gprof对于代码大部分是用户空间的CPU密集型的程序用处明显。
gprof的缺点:
- 对于大部分时间运行在内核空间或者由于外部因素(例如操作系统的 I/O 子系统过载)而运行得非常慢的程序难以进行优化。
- gprof默认不支持多线程程序。(gprof采用ITIMER_PROF信号,在多线程内只有主线程才能响应该信号)
- 默认不支持共享库程序。
2. gprof的用法
2.1. 编译程序
首先,需要使用 -pg
选项编译你的程序:
g++ -pg -o my_program my_program.cpp
除了-pg
外,还有一个参数-p
,它可以生成适合prof
性能分析工具的代码,他们之间的区别如下:
-p
: 可以生成适合prof
性能分析工具的代码。-pg
: 可以生成适合gprof
性能分析工具的代码,也就是profile information for gprof
的含义。
要理解上面描述,又不得不了解prof
和gprof
两个工具的关系了。
- prof是一个较早的性能分析工具,最初在UNIX系统上使用。编译时加上-p选项,生成的可执行文件会在运行时收集性能分析数据。然后通过
prof
工具再生成性能分析报告。 - gprof是GNU项目的一部分,是一个更现代的性能分析工具,它的功能与
prof
类似,但比prof
提供了更多的功能和更好的用户体验。而且程序运行时输出的性能分析数据也更丰富、详细。现在gprof
几乎取代了prof
。
2.2. 运行程序
编译完成后,运行你的程序:
./my_program
运行过程中,gprof
会生成一个名为 gmon.out
的文件,其中包含了性能分析数据。
2.3. 生成分析报告
运行完程序后,使用 gprof
工具生成分析报告:
gprof my_program gmon.out > analysis_report.txt
生成的 analysis_report.txt
文件中包含了函数的调用时间、调用次数等详细信息。
2.4. gprof常用参数说明
gprof命令格式:
gprof [options] [executable-file [profile-data-files…]] [> outputfile] Gprof命令行格式 Gprof command line format
options参数说明:
命令 | 中文解释 | 英文解释 |
---|---|---|
-b | 简洁输出,不显示冗长的解释 | Brief output. Do not display verbose explanations |
-s | 将多个gmon.out文件合并 | Summarize: merge several profile data files for cumulative stats |
-p | 显示程序的每个函数的执行时间统计 | Display program’s functions execution time statistics |
-q | 显示程序的每个函数的调用关系 | Display program’s |
2.5. 分析报告解读
gprof
生成的报告通常包含以下几个部分:
- Flat profile: 显示每个函数的执行时间、调用次数等信息。
- Call graph: 显示函数之间的调用关系和每个函数的执行时间。
2.5.1. Flat profile
各个字段的含义
字段 | 含义 |
---|---|
% time | 该函数消耗时间占程序所有时间百分比 |
Cumulative seconds | 程序的累积执行时间(只是包括gprof能够监控到的函数) |
Self Seconds | 该函数本身执行时间(所有被调用次数的合共时间) |
Calls | 函数被调用次数 |
Self TS/call | 函数平均执行时间(不包括被调用时间,函数的单次执行时间) |
Total TS/call | 函数平均执行时间(包括被调用时间,函数的单次执行时间) |
name | 函数名 |
2.5.2. Call graph
各个字段的含义
字段 | 含义 |
---|---|
Index | 索引值 |
%time | 函数消耗时间占所有时间百分比 |
Self | 函数本身执行时间 |
Children | 执行子函数所用时间 |
Called | 被调用次数 |
Name | 函数名 |
3. Demo演示
3.1. demo04.cpp 源码
#include
int64_t add(int64_t a, int64_t b)
{
return a + b;
}
void func1()
{
int sum = 0;
for (int i = 0; i
3.2. 编译、运行和分析
# 编译程序
g++ -pg ./demo04.cpp -o ./demo04.out
# 运行程序
./demo04.out
# 生成分析报告
gprof ./demo04.out ./gmon.out > analysis_report04.txt
# 也可以使用下面的命令,生成的报告更加简洁,没有冗余信息
gprof -b ./demo04.out ./gmon.out > analysis_report04.txt
3.3. 查看分析报告
打开analysis_report04.txt
,可以看到类似如下的输出:
Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1500000 0.00 0.00 add(long, long)
0.00 0.00 0.00 1 0.00 0.00 func1()
0.00 0.00 0.00 1 0.00 0.00 func2()
...
Call graph (explanation follows)
granularity: each sample hit covers 4 byte(s) no time propagated
index % time self children called name
0.00 0.00 500000/1500000 func2() [10]
0.00 0.00 1000000/1500000 func1() [9]
[8] 0.0 0.00 0.00 1500000 add(long, long) [8]
-----------------------------------------------
0.00 0.00 1/1 main [6]
[9] 0.0 0.00 0.00 1 func1() [9]
0.00 0.00 1000000/1500000 add(long, long) [8]
-----------------------------------------------
0.00 0.00 1/1 main [6]
[10] 0.0 0.00 0.00 1 func2() [10]
0.00 0.00 500000/1500000 add(long, long) [8]
-----------------------------------------------
...
Index by function name
[8] add(long, long) [9] func1() [10] func2()
通过这些信息,可以清楚地看到 func1 和 func2 的执行时间和调用次数,从而进行针对性的优化。
历史文章推荐:
大家好,我是陌尘。
IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。
搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。
感谢大家的关注,期待与你一起成长。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容