gprof使用介绍 (gcc -pg)
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)相关推荐
- GCC(-pg) profile mcount | ftrace基础原理
GCC(-pg) profile mcount 荣涛 2021年5月12日 gcc的profile特性,gcc 的 -pg 选项将在每个函数的入口处加入对mcount的代码调用; 如果ftrace编写 ...
- 嘉宾介绍 | 2020 PG亚洲大会中文分论坛:潘娟
作为全球最大.最知名的PG序列会议,从纽约到莫斯科,从里约热内卢到约翰内斯堡,全球各地区都有PGConf在运行.而亚洲规格最高的PG技术盛会-PGConf.Asia大会,将于今年11月首度在中国举行. ...
- gprof工具使用介绍
一.gprof介绍 gprof是GNUprofiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...
- gcc g++ 参数介绍
C和C++ 编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理 (preprocessing),编译(compilation),汇编(assembly)和连接(linking).源 ...
- gprof 使用和介绍
一.gprof介绍 gprof是GNU profiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...
- Linux下终端的相关函数,gprof 使用和介绍
一.gprof介绍 gprof是GNU profiler工具.可以显示程序运行的"flat profile",包括每个函数的调用次数,每个函数消耗的处理器时间.也可以显示" ...
- GCC编译选项参数介绍
gcc和g++分别是gnu的c和c++编译器,下面是整理的常用编译选项参数: #(1). -x: 设定文件所使用的语言,使文件后缀名无效,如下,执行完后生成test.o gcc -c -x c++ t ...
- GCC编译器原理(一)03------GCC 工具:gprof、ld、libbfd、libiberty 和libopcodes
1.3.7 gprof:性能分析工具 参考文档:https://www.cnblogs.com/andashu/p/6378000.html gprof是GNU profile工具,可以运行于linu ...
- 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 ...
最新文章
- plc和pc串口通讯接线_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
- proto文件支持继承吗_搞懂 Javascript中this 指向及继承原理
- nginx could not build the server_names_hash 解决方法
- 区块链大热,和出版业如何发生关系?
- 中间代码生成器-5-编译原理
- jsp stc_为什么说jsp的本质是servlet?
- 第26讲:模拟登录爬取实战案例
- 掌握 Ajax,第 4 部分: 利用 DOM 进行 Web 响应
- Java设计模式笔记(3)抽象工厂模式
- python合并两个有序列表_Python实现合并两个有序链表的方法示例
- PG基于repmgr实现自动和手动故障切换
- 谁该为马化腾表态这个乌龙尴尬?
- 【日常水题——快速幂系列】
- 用sox查看wav声音的基本信息
- Notes Twenty one days-渗透攻击-红队-权限提升
- Sphinx入门教程
- 微信去除 防欺诈或盗号请不要输入qq密码 的方法
- The bean ‘xxx‘ could not be injected as a ‘xxx‘ because it is a JDK dynamic proxy that implements:
- 锄头哥直播技术探讨----基础普及篇
- Cesium添加geojson数据及WMS在线图层服务