gprof使用介绍 (gcc -pg) [转]
原文出处: http://blog.csdn.net/unbutun/article/details/6609498
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(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 argc, char** argv)
{
int i; for (i = 0; i < 1000000; i++)
{
f1();
f2();
f3();
} return 0;
}
要启用gprof很简单,gcc编译的时候带上-pg参数即可;
编译好了之后运行可执行文件,会产生gmon.out文件。
这就是gprof的日志,里面记录了程序运行cpu的使用信息。打开看看?杯具,二进制文件,我们人类看不懂。。。我们要运行下面的命令生成报表:
gprof a.out gmon.txt > report.txt
这个过程执行如下图:

gcc -g -pg xxx.c
g++ -g -pg xxx.cpp
./a.out
gprof a.out gmon.out > report.txt
Gprof 产生的信息解释:
|
%time |
Cumulative seconds |
Self Seconds |
Calls |
Self TS/call |
Total TS/call |
name |
|
该函数消耗时间占程序所有时间百分比 |
程序的累积执行时间 (只是包括gprof能够监控到的函数) |
该函数本身执行时间 (所有被调用次数的合共时间) |
函数被调用次数 |
函数平均执行时间 (不包括被调用时间) (函数的单次执行时间) |
函数平均执行时间 (包括被调用时间) (函数的单次执行时间) |
函数名 |
Call Graph 的字段含义:
|
Index |
%time |
Self |
Children |
Called |
Name |
|
索引值 |
函数消耗时间占所有时间百分比 |
函数本身执行时间 |
执行子函数所用时间 |
被调用次数 |
函数名 |
注意:
程序的累积执行时间只是包括gprof能够监控到的函数。工作在内核态的函数和没有加-pg编译的第三方库函数是无法被gprof能够监控到的,(如sleep()等)
Gprof 的具体参数可以 通过 man gprof 查询。
打开report.txt,我们可以看到两张表。
第一张:

这就是每个函数占用cpu的时间以及百分比了。我们可以很明显的看到f1()、f2()和f3()所用的时间关系。很准确。
第二张:函数调用表,描述了函数调用的相互关系

仔细看吧。
下面介绍个更给力的工具来生成报表(其实是图)——gprof2dot:http://code.google.com/p/jrfonseca/wiki/Gprof2Dot。
首先下载gprof2dot.py,http://code.google.com/p/jrfonseca/wiki/Gprof2Dot有这个工具。
然后下载graphviz工具
apt-get install python graphviz
安装完成这些工具之后,执行如下的命令:

(1)gprof2dot.py命令将报report.txt转化为xxx.dot文件(graphviz http://www.graphviz.org/图像文件格式)。
(2)dot命令将这个文件xxx.dot再转为png格式。
好吧现在用图像软件打开吧:
gprof使用介绍 (gcc -pg) [转]的更多相关文章
- Linux性能评测工具之一:gprof篇介绍
转:http://blog.csdn.net/stanjiang2010/article/details/5655143 这些天自己试着对项目作一些压力测试和性能优化,也对用过的测试工具作一些总结,并 ...
- gprof使用介绍
gprof 1.1 简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ...
- gprof使用介绍【转】
转自:https://blog.csdn.net/linquidx/article/details/5916701 gprof 1.1 简介 gprof实际上只是一个用于读取profile结 ...
- gcc g++ 参数介绍
C和C++ 编译器是集成的.他们都要用四个步骤中的一个或多个处理输入文件: 预处理 (preprocessing),编译(compilation),汇编(assembly)和连接(linking).源 ...
- gprof的使用介绍
转于:http://blog.chinaunix.net/uid-25194149-id-3215487.html #不知道这是在哪里找的了,感谢各位~ 性能分析工具gprof介绍Ver:1.0 目录 ...
- 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高级测试功能扩展——程序性能测试工具gprof、程序覆盖测试工具gcov
gprof是GNU组织下的一个比较有用的性能测试功能: 主要功能: 找出应用程序中消耗CPU时间最多的函数: 产生程序运行时的函数调用关系.调用次数 基本原理: 首先用户要使用gprof工具, ...
- GCC&&GDB在OI中的介绍
序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...
- gcc for Windows 开发环境介绍
导读: 在Windows操作系统下的gcc 第一节 GCC家族概览 GCC是一个原本用于Unix-like系统下编程的编译器. 只是,如今GCC也有了很多Win32下的移植版本号.所以,或许对于很多W ...
随机推荐
- Centos 6.5_64bit 下安装 Zabbix server 3.0监控主机的加入
安装Zabbix server 3.0客户端之前需要先关闭selinux和打开10050和10051端口 关闭selinux 1 vi /etc/selinux/config 2 ...
- xampp中mysql重置root密码
1. 停止mysql:用图形化工具或者在cmd命令下输入net stop mysql,在c盘根目录下输入 2. 打开cmd,切换目录到 /xampp/mysql/bin, 运行 mysqld ...
- 数据结构(C#):图的最短路径问题、(Dijkstra算法)
今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理: 题目: 要求:变成计算出给出结点V1到结点V8的最短路径 答: 首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来 ...
- Gameplay Classes
每个虚幻游戏类都是一个.h和一个.cpp组成. 类在虚幻中有便准的命名模式. 前缀: A继承于可量产的游戏性类.他们都是Actor,可以直接在游戏中生成. U继承于所有游戏性对象.不能在游戏中直接生成 ...
- leetcode 141、Linked list cycle
一种方法是用set存储出现过的指针,重复出现时就是有环: class Solution { public: bool hasCycle(ListNode *head) { set<ListNod ...
- MVC中某个页面不需要引用母版页的正确写法
有些页面想使用单独的样式不想用母版页的时候,可以在开始声明下,就可以不用母版页的CSS和JS引用了语法如下: @{Layout = "";} . 非常之简单
- A. Round House_数学问题
A. Round House time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Docker 日常指令
镜像 制作镜像 docker build –t 172.0.0.1/demo/xxx:20180906_002 .[不要忘记 点] 查看镜像 docker images 删除镜像 docker rmi ...
- LeetCode297. Serialize and Deserialize Binary Tree
题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实 ...
- python基础——文件访问模式
文件访问模式 访问模式 说明 r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. w 打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. a 打开一个 ...