gprof使用介绍 (gcc -pg)

本文通过使用gprof和gprof2dot工具,详细解析了一个Linux服务端编程程序的性能瓶颈,包括函数调用时间占比和调用关系,以及通过生成可视化的调用图来直观展示各部分代码的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux服务端编程,性能总是不可避免要思考的问题。

而单机(严格的说是单核)单线程程序(严格的说是逻辑)又是所有复杂应用的基础。所以,这块的性能是整个应用的基础。

当遇到应用相应很慢的时候我们往往会疑问:这么强劲的CPU到底在干什么,反应这么慢。

满足你!linux下常用的性能工具就是跟gcc一起的gprof。来个例子程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
  
void f1() {
   int i;
   int *p;
   for (i = 0; i < 10; i++) {
     p = malloc ( sizeof ( int ));
     *p = 10;
     free (p);
   }
}
  
void f2() {
   int i;
   int *p;
   for (i = 0; i < 20; i++) {
     p = malloc ( sizeof ( int ));
     *p = 10;
     free (p);
   }
}
  
void f3() {
   int i;
   int *p;
   for (i = 0; i < 30; i++) {
     p = malloc ( sizeof ( int ));
     *p = 10;
     free (p);
   }
}
  
int main() {
   int i;
  
   for (i = 0; i < 1000000; i++) {
     f1();
     f2();
     f3();
   }
  
   return 0;
}

哈哈,好烂的程序啊。我们现在要通过gprof找出这个程序运行时cpu都用来干什么了。

要启用gprof很简单,gcc编译的时候带上-pg参数即可:

1
gcc -g -pg test.c -o test

下面运行./test。运行完我们可以看到目录下多了个gmon.out的文件。这就是gprof的日志,里面记录了程序运行cpu的使用信息。打开看看?杯具,二进制文件,我们人类看不懂。。。我们要运行下面的命令生成报表:

1
gprof ./test gmon.out >report.txt

打开report.txt,我们可以看到两张表。

第一张:

1
2
3
4
5
6
7
8
Flat profile:
  
Each sample counts as 0.01 seconds.
   %   cumulative   self              self     total
time   seconds   seconds    calls  ns/call  ns/call  name
56.25      0.32     0.32  1000000   315.00   315.00  f3
33.04      0.50     0.18  1000000   185.00   185.00  f2
10.71      0.56     0.06  1000000    60.00    60.00  f1

这就是每个函数占用cpu的时间以及百分比了。我们可以很明显的看到f1()、f2()和f3()所用的时间关系。很准确。

第二张表式函数调用表,描述了函数调用的相互关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
granularity: each sample hit covers 4 byte(s) for 1.79% of 0.56 seconds
  
index % time    self  children    called     name
                                                  <spontaneous>
[1]    100.0    0.00    0.56                 main [1]
                 0.32    0.00 1000000/1000000     f3 [2]
                 0.18    0.00 1000000/1000000     f2 [3]
                 0.06    0.00 1000000/1000000     f1 [4]
-----------------------------------------------
                 0.32    0.00 1000000/1000000     main [1]
[2]     56.2    0.32    0.00 1000000         f3 [2]
-----------------------------------------------
                 0.18    0.00 1000000/1000000     main [1]
[3]     33.0    0.18    0.00 1000000         f2 [3]
-----------------------------------------------
                 0.06    0.00 1000000/1000000     main [1]
[4]     10.7    0.06    0.00 1000000         f1 [4]
-----------------------------------------------

仔细看吧。

下面介绍个更给力的工具来生成报表(其实是图)——gprof2dot:http://code.google.com/p/jrfonseca/wiki/Gprof2Dot

接着上面的report.txt,执行下面命令:

1
2
3
gprof2dot report.txt > test.dot
  
dot -Tpng -o test.png

第一句的意思是将报表转化为dot文件(graphviz http://www.graphviz.org/图像文件格式)。第二句的意思是将这个文件再转为png格式。好吧现在用图像软件打开吧:

不用解释了吧。调用次数/本身所花cpu时间/调用的函数所花时间 一目了然!

 

在软件开发过程中,GCC、CMake 和 GProf 是常用的工具链,它们分别用于编译、构建管理和性能分析。通过合理地集成这些工具,可以实现高效的项目构建和性能优化。 ### GCC 与 CMake 的集成 CMake 是一个跨平台的构建系统生成工具,它可以根据平台的不同生成相应的构建文件(如 Makefile 或 Visual Studio 工程文件)。GCC 是 GNU 的编译器套件,广泛用于 Linux 和其他类 Unix 系统上。CMake 支持使用 GCC 作为编译器,并且可以通过设置 CMake 的变量来指定 GCC 的路径和编译选项。 例如,在 CMakeLists.txt 文件中,可以通过以下方式指定使用 GCC 编译器: ```cmake set(CMAKE_C_COMPILER "/usr/bin/gcc") set(CMake_CXX_COMPILER "/usr/bin/g++") ``` 此外,还可以传递特定的编译选项给 GCC,如优化级别、调试信息等: ```cmake add_compile_options(-O3 -g) ``` ### 使用 GProf 进行性能分析 一旦项目构建完成,就可以使用 GProf 来分析程序的性能。GProfGCC 提供的一个性能分析工具,它可以生成程序执行期间函数调用关系的详细报告。为了使用 GProf,需要在编译时加入 `-pg` 选项,这会使得编译器生成带有 profiling 信息的可执行文件。 编译命令可能如下所示: ```bash gcc -pg -o test test.c ``` 运行程序后,会在当前目录下生成一个名为 `gmon.out` 的文件,这个文件包含了程序运行期间的性能数据。 ### 分析 GProf 输出 使用 GProf 工具分析 `gmon.out` 文件,可以得到程序中各个函数的调用次数、执行时间等信息。命令如下: ```bash gprof test gmon.out > profile.txt ``` 打开 `profile.txt` 文件可以看到详细的性能分析结果,这些结果可以帮助开发者识别程序中的瓶颈,并据此进行优化。 ### 总结 通过上述步骤,可以有效地将 GCC、CMake 和 GProf 集成在一起,用于项目的构建和性能分析。这种集成不仅提高了开发效率,也为性能优化提供了有力的支持[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值