忆雏闲 发表于 6 天前

Linux C++ 开发9 - 手把手教你使用gprof性能分析工具


[*]1. 什么是gprof?
[*]2. gprof的用法

[*]2.1. 编译程序
[*]2.2. 运行程序
[*]2.3. 生成分析报告
[*]2.4. gprof常用参数说明
[*]2.5. 分析报告解读

[*]2.5.1. Flat profile 各个字段的含义
[*]2.5.2. Call graph 各个字段的含义


[*]3. Demo演示

[*]3.1. demo04.cpp 源码
[*]3.2. 编译、运行和分析
[*]3.3. 查看分析报告

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 ] [> 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’s2.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 < 1000000; ++i)    {      sum = add(sum, i);    }    std::cout
页: [1]
查看完整版本: Linux C++ 开发9 - 手把手教你使用gprof性能分析工具