zoukankan      html  css  js  c++  java
  • 程序性能调优工具之gprob

    1 简介
    改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数消耗掉了大部分执行时间,这通常都不是非常明显的。GNU 编译器工具包所提供了一种剖析工具 GNU profiler(gprof)。gprof 可以为 Linux平台上的程序精确分析性能瓶颈。gprof精确地给出函数被调用的时间和次数,给出函数调用关系。 
    gprof 用户手册网站 http://sourceware.org/binutils/docs-2.17/gprof/index.html
    2 功能
    Gprof 是GNU gnu binutils工具之一,默认情况下linux系统当中都带有这个工具。
    1. 可以显示“flat profile”,包括每个函数的调用次数,每个函数消耗的处理器时间,
    2. 可以显示“Call graph”,包括函数的调用关系,每个函数调用花费了多少时间。
    3. 可以显示“注释的源代码”--是程序源代码的一个复本,标记有程序中每行代码的执行次数。
    3 原理
    通过在编译和链接程序的时候(使用 -pg 编译和链接选项),gcc 在你应用程序的每个函数中都加入了一个名为mcount ( or  “_mcount”  , or  “__mcount” , 依赖于编译器或操作系统)的函数,也就是说你的应用程序里的每一个函数都会调用mcount, 而mcount 会在内存中保存一张函数调用图,并通过函数调用堆栈的形式查找子函数和父函数的地址。这张调用图也保存了所有与函数相关的调用时间,调用次数等等的所有信息。
    4 使用流程
    [cpp] view plain copy
    1. 在编译和链接时 加上-pg选项。一般我们可以加在 makefile 中。  
    2. 执行编译的二进制程序。执行参数和方式同以前。  
    3. 在程序运行目录下 生成 gmon.out 文件。如果原来有gmon.out 文件,将会被重写。  
    4. 结束进程。这时 gmon.out 会再次被刷新。  
    5. 用 gprof 工具分析 gmon.out 文件  

    5 参数说明
    l -b 不再输出统计图表中每个字段的详细描述。
    l -p 只输出函数的调用图(Call graph的那部分信息)。
    l -q 只输出函数的时间消耗列表。
    l -e Name 不再输出函数Name 及其子函数的调用图(除非它们有未被限制的其它父函数)。可以给定多个 -e 标志。一个 -e 标志只能指定一个函数。
    l -E Name 不再输出函数Name 及其子函数的调用图,此标志类似于 -e 标志,但它在总时间和百分比时间的计算中排除了由函数Name 及其子函数所用的时间。
    l -f Name 输出函数Name 及其子函数的调用图。可以指定多个 -f 标志。一个 -f 标志只能指定一个函数。
    l -F Name 输出函数Name 及其子函数的调用图,它类似于 -f 标志,但它在总时间和百分比时间计算中仅使用所打印的例程的时间。可以指定多个 -F 标志。一个 -F 标志只能指定一个函数。-F 标志覆盖 -E 标志。
    l -z 显示使用次数为零的例程(按照调用计数和累积时间计算)。
    一般用法: gprof –b 二进制程序 gmon.out >report.txt
    6 报告说明

    参考文档:

    1  http://blog.csdn.net/meijia_tts/article/details/7087296 使用指南

    2 性能分析工具介绍: http://blog.csdn.net/u014717036/article/details/50762252 

    3 http://blog.csdn.net/vevenlcf/article/details/51791099 总体介绍

  • 相关阅读:
    【spring源码分析】IOC容器初始化(五)
    【spring源码分析】IOC容器初始化(四)
    【spring源码分析】IOC容器初始化(三)
    【spring源码分析】IOC容器初始化(二)
    Thread.currentThread()和this的区别——《Java多线程编程核心技术》
    【spring源码分析】IOC容器初始化(一)
    【spring源码分析】准备工作
    DefaultNamespaceHandlerResolver中handlerMappings如何初始化
    SimpleDateFormat非线程安全
    MyBatis批量操作
  • 原文地址:https://www.cnblogs.com/dylancao/p/7680252.html
Copyright © 2011-2022 走看看