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

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

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

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

#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§;
}
}

void f2() {
int i;
int *p;
for (i = 0; i < 20; i++) {
p = malloc(sizeof(int));
*p = 10;
free§;
}
}

void f3() {
int i;
int *p;
for (i = 0; i < 30; i++) {
p = malloc(sizeof(int));
*p = 10;
free§;
}
}

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,我们可以看到两张表。

第一张:

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()所用的时间关系。很准确。

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

granularity: each sample hit covers 4 byte(s) for 1.79% of 0.56 seconds

index % time self children called name

[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,执行下面命令:

gprof2dot report.txt > test.dot

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

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

gprof使用介绍 (gcc -pg)相关推荐

  1. GCC(-pg) profile mcount | ftrace基础原理

    GCC(-pg) profile mcount 荣涛 2021年5月12日 gcc的profile特性,gcc 的 -pg 选项将在每个函数的入口处加入对mcount的代码调用; 如果ftrace编写 ...

  2. 嘉宾介绍 | 2020 PG亚洲大会中文分论坛:潘娟

    作为全球最大.最知名的PG序列会议,从纽约到莫斯科,从里约热内卢到约翰内斯堡,全球各地区都有PGConf在运行.而亚洲规格最高的PG技术盛会-PGConf.Asia大会,将于今年11月首度在中国举行. ...

  3. gprof工具使用介绍

    一.gprof介绍 gprof是GNUprofiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...

  4. gcc g++ 参数介绍

    C和C++ 编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理 (preprocessing),编译(compilation),汇编(assembly)和连接(linking).源 ...

  5. gprof 使用和介绍

    一.gprof介绍 gprof是GNU profiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...

  6. Linux下终端的相关函数,gprof 使用和介绍

    一.gprof介绍 gprof是GNU profiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...

  7. GCC编译选项参数介绍

    gcc和g++分别是gnu的c和c++编译器,下面是整理的常用编译选项参数: #(1). -x: 设定文件所使用的语言,使文件后缀名无效,如下,执行完后生成test.o gcc -c -x c++ t ...

  8. GCC编译器原理(一)03------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes

    1.3.7 gprof:性能分析工具 参考文档:https://www.cnblogs.com/andashu/p/6378000.html gprof是GNU profile工具,可以运行于linu ...

  9. GCC编译器原理 1.3------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes

    1.3.7 gprof:性能分析工具 参考文档:https://www.cnblogs.com/andashu/p/6378000.html gprof是GNU profile工具,可以运行于linu ...

最新文章

  1. plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
  2. proto文件支持继承吗_搞懂 Javascript中this 指向及继承原理
  3. nginx could not build the server_names_hash 解决方法
  4. 区块链大热,和出版业如何发生关系?
  5. 中间代码生成器-5-编译原理
  6. jsp stc_为什么说jsp的本质是servlet?
  7. 第26讲:模拟登录爬取实战案例
  8. 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应
  9. Java设计模式笔记(3)抽象工厂模式
  10. python合并两个有序列表_Python实现合并两个有序链表的方法示例
  11. PG基于repmgr实现自动和手动故障切换
  12. 谁该为马化腾表态这个乌龙尴尬?
  13. 【日常水题——快速幂系列】
  14. 用sox查看wav声音的基本信息
  15. Notes Twenty one days-渗透攻击-红队-权限提升
  16. Sphinx入门教程
  17. 微信去除 防欺诈或盗号请不要输入qq密码 的方法
  18. The bean ‘xxx‘ could not be injected as a ‘xxx‘ because it is a JDK dynamic proxy that implements:
  19. 锄头哥直播技术探讨----基础普及篇
  20. Cesium添加geojson数据及WMS在线图层服务

热门文章

  1. Spring Boot 2.x基础教程:使用Elastic Job实现定时任务
  2. 每日一皮:这真的是亲爹吗...
  3. 每日一皮:一直认为写代码的自己有点小帅
  4. Java 中几种获取文件路径的方式
  5. 除了Postman之外,居然还有个Postwoman...
  6. 操作系统中,进程与线程怎么设计的?
  7. 当当大促的额外优惠来啦!160 买 400的书!搓搓搓~
  8. 一个97年的IT人创业历程中的总结和感悟
  9. 使用phpqrcode生成二维码时候显示不正常,有一个小方块
  10. AI算法图片转二次元卡通