gprof
函数级耗时剖析。gprof不会说谎,仔细考虑下函数的实现细节。
准备工作
- 对单文件simulator.cpp编译
- 编译:g++ -g -pg simulator.cpp -o simulator.o
- 链接:g++ -pg simulator.o -o simulator
- 对于使用CMakeLists.txt的工程
add_definitions(-g -pg)set_target_properties(simulator PROPERTIES LINK_FLAGS"-pg") # 必须用""把-pg引起来#只对执行文件有效,对库文件使用无效#如果想对自己的库文件做相应的剖析,把所有源文件都放在add_executable中
我们可以使用-O2对编译文件优化,但是一定要加-g -pg。在我的测试中,效果很好。大家务必试试。
生成剖析文件
- 执行程序,会在当前文件目录下生成gmon.out剖析文件
./simulator #除非程序处理了中断,保证收到中断能正常退出时,才会生成gmon.out文件 - 导出可读的性能文件
gprof simulator gmon.out > perf.log
解读剖析文件
主要关注两部分:Flat profile与Call graph
Flat profile
|
1
2
3
4
5
6
7
|
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 25.37 3.81 3.81 71089134 0.00 0.00 shared_buffer::BufferInterface::WriteBuffer(BufferDescriptor const&) 8.92 5.15 1.34 71089350 0.00 0.00 shared_buffer::BufferInterface::CopyBuffer(BufferDescriptor const&, SharedBuffer*) 7.99 6.35 1.20 71089350 0.00 0.00 shared_buffer::SharedBuffer::AllocCell(int) 5.16 7.13 0.78 71089062 0.00 0.00 GenerateTime(timeval&) |
拿第5行来说
- % time:该函数占总运行时间的8.92%
- cumulative seconds:累积前面的函数调用,总时间为5.15秒
- self seconds:自身使用1.34秒
- calls:该函数被调用71089350次
- self ms/call:(单位可能是s/ms/ns依据调用情况来决定)未知,可能是平均调用时间,求解
- total ms/call:(单位可能是s/ms/ns依据调用情况来决定)未知,求解
- name:那么的直观
当我们拿到这样的结果时,我们首先应该关注下排名靠前的函数(为什么这么耗时),其次关注调用次数最多的函数(为什么会调用这么多次),还有就是关注你目前想了解的函数是否符合预期(调用次数与时间)
Call graph
index % time self children called name <spontaneous>[1] 98.9 0.00 14.86 main [1] 0.26 14.47 1/1 RunLoader(shared_buffer::BufferInterface&) [2] 0.00 0.11 1/1 shared_buffer::BufferInterface::BufferInterface(std::string const&) [24] 0.00 0.02 1/1 shared_buffer::BufferInterface::~BufferInterface() [31]----------------------------------------------- 0.26 14.47 1/1 main [1][2] 98.0 0.26 14.47 1 RunLoader(BufferInterface&) [2] 0.57 12.92 71089062/71089062 SendBuffer2(BufferInterface&, DataType, unsigned int, OMTime const&) [3] 0.78 0.00 71089062/71089062 GenerateTime(timeval&) [10] 0.17 0.00 71089134/71089134 omatrix::OMTime::OMTime(timeval const&) [22] 0.03 0.00 71089134/71089145 omatrix::OMTime::~OMTime() [28] 0.01 0.00 72/72 SendBuffer(BufferInterface&, DataType, unsigned int, OMTime const&) [36] 0.00 0.00 4/4 rdtsc() [137]----------------------------------------------- 0.57 12.92 71089062/71089062 RunLoader(shared_buffer::BufferInterface&) [2][3] 89.8 0.57 12.92 71089062 SendBuffer2(BufferInterface&, DataType, unsigned int, OMTime const&) [3] 3.81 9.11 71089062/71089134 shared_buffer::BufferInterface::WriteBuffer(BufferDescriptor const&) [4]----------------------------------------------- |
拿index为2的来说
- index:目前关注的重点函数编号,我们可以每行的未端看到同样形式的编号
- time:该函数及其子函数的总耗时百分比为98.0%
- self:该函数自身耗时0.26秒,该值等于前面的Flat profile部分的self seconds。同时该值也等于此部分中调用该函数的self的和。
- children:该函数调用的子函数耗时14.47,同时大家可以算算,其子函数的self+children总和等于该值。同时该值也等于此部分中调用该函数的children的和。
- called:如果是当前函数,该值没有/分割,表明它被调用的次数;如果是父/子函数,前半部分表示涉及该调用栈的次数,后半部分表示该函数总的被调用次数
- name:还是那么的直观
通过该部分我们可以非常直观的观察调用关系,看是否有函数的调用是自己未预期的。
gprof的更多相关文章
- C和指针 第十八章 性能评测工具gprof
linux平台下的gprof评测工具可以对程序进行分析,需要在编译时加上-pg选项,如上一章的二叉树代码: gcc -pg main.c ArrayBinaryTree.h ArrayBinaryTr ...
- linux 代码分析工具 gprof - 以wpa_supplicant为例
当我们遇到一个新的程序的时候,经常会无从下手,需要debug一个功能的时候,我们不知道函数的运行流程是怎么样的,这就需要借助工具来帮助我们加快流程了.这里以分析wpa_supplicant为例 ...
- gprof参数说明及常见错误
参数说明 l -b 不再输出统计图表中每个字段的详细描述. l -p 只输出函数的调用图(Call graph的那部分信息). l -q 只输出函数的时间消耗列表. l -e Name 不再输出函数N ...
- 高级工具gprof、gprof2dot.py、dot
可以研究程序性能.函数调用堆栈等,而且能用图标查看. linux环境下 C++性能测试工具 gprof + kprof + gprof2dot - 阁子 - 博客园 gprof.gprof2dot.p ...
- gprof使用介绍
gprof 1.1 简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ...
- gprof + kprof + gprof2dot (性能 与 函数调用图)-
http://www.cnblogs.com/rocketfan/archive/2009/11/15/1603465.html http://blog.csdn.net/stanjiang2010/ ...
- Linux下的经常使用性能查询命令top、vmstat、gprof、pidstat之对照
(1)查看各个CPU核的使用情况 sudo top -d 1 进入之后,按1,会出现以下的CPU使用情况,当中us列反映了各个CPU核的使用情况,百分比大说明该核在进行紧张的任务. (2)查看哪个进程 ...
- 服务器性能分析工具gprof的使用及没有生成gmon.out文件的原因
早上从网上查看资料时无意中看到了gprof这个工具,随便把他用在项目里试了一下.结果发现调用次数的数据比较全,但调用时间基本上都是0.网上查了一下发现gprof只记录执行时间超过0.0 ...
- Linux C++程序进行性能分析工具gprof使用入门
性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...
随机推荐
- Java_基础_内存管理
把没几多年,完全忘记了把自己学的东西记录下来了,现在也基本不知道怎么去记录会更好了,不过好歹妹是把住了~也要毕业了,继续回来写东东记录自己的学习...... 一个Java程序在运行时的内存分布主要如上 ...
- kafka删除topic
手动: 删除kafka存储目录(server.properties文件log.dirs配置,默认为"/tmp/kafka-logs")相关topic目录 删除zookeeper & ...
- c#基础--常量(const),只读字段(readonly)
1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string n ...
- 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法
工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较 ...
- recent.css常用的页面初始化样式
<style> @charset "utf-8"; body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form ...
- NSDate简单介绍
NSDate简单介绍 一:NSDate是一个日期\时间方面的类,主要用来创建\获取时间 1.NSDate对象的创建: date 创建一个当前系统日期和时间的对象 dateWithTimeInterva ...
- struts2+jquery 实现ajax登陆
一.新建一个web项目:test,配置好struts2的环境(详细配置见:http://www.cnblogs.com/wuweidu/p/3841297.html) 导入Jquery的j ...
- Java Script基础(六) DOM模型
一.文档对象模型 DOM( Document Object Model)文档对象模型,它提供了访问.动态修改文档的借口,W3C指定了DOM规范,主流浏览器都支持.DOM由3部分组成,分别是CoreDo ...
- Sql Server触发器案例(初学者学习案例)
万事都是从最简单的一句“hello world”开始,所以我接下里介绍的sql触发器学习案例也从最简单的案例来说明分析: 1.首先创建表,这几张表你们也许很熟,在百度搜触发器案例都是使用这2张表 Cr ...
- PHP中正则替换函数preg_replace用法笔记
今天应老板的需求,需要将不是我们的页面修改一个链接,用js+iframe应该也能实现,但是我想尝试一下php实现方法. 首先你得先把别人的页面download到你的php中,实现方法可以用curl, ...