Welcome 微信登录

首页 / 操作系统 / Linux / Linux下GCC程序优化工具gprof和gcov实例

第一:gprof工具gprof工具是通过在执行的过程中往可执行文件中加入特殊的代码,随着可执行程序的运行而运行,从而记录执行情况,通过这个工具可以检测某个函数调用的次数和时间,这样的话就可以集中优化那个调用最为频繁的函数,来实现程序的优化。这里是一个使用gprof的实例:[root@localhost new]# vim aa.c          }}unsigned int nseq(unsigned int x0){        unsigned int i = 1,x;        if (x0 == 1 || x0 ==0)                return i;        x = step(x0);        while(x != 1 && x != 0)        {                x = step(x);                i++;        }        return i;}int main(void){        unsigned int i,m=0,im=0;        for(i=1;i<500000;i++)        {                unsigned int k = nseq(i);                if(k>m)                {                        m = k;                        im = i;                        printf("sequence length = %u for %u ",m,im);                }        }        return 0;}[root@localhost new]# gcc -Wall -pg aa.c   //通过加入-pg的选项实现[root@localhost new]# ./a.out    //执行的过程[root@localhost new]# lsa.out  aa.c  gmon.out[root@localhost new]# gprof a.out   通过查看输出信息就可以检测哪个函数使用最为频繁,通过优化此函数也就可以优化整个程序第二:gcov工具用于统计一个程序中每一行的执行时间,也用于优化程序实例[root@localhost new]# vim bb.c  #include <stdio.h> int main(void){int i;        for(i=1;i<10;i++)        {                if(i%3 == 0)                        printf("%d is divisible by 3 ",i);                if(i%11 == 0)                        printf("%d is divisible by 11 ",i);        }        return 0;}[root@localhost new]# gcc -Wall -fprofile-arcs -ftest-coverage bb.c  //加上那两个新参数[root@localhost new]# lsa.out    bb.c  bb.gcno  [root@localhost new]# ./a.out 3 is divisible by 3 6 is divisible by 3 9 is divisible by 3 [root@localhost new]# lsa.out    bb.c  bb.gcda  bb.gcno  [root@localhost new]# gcov bb.c   //注意是gcov源码文件File "bb.c"Lines executed:85.71% of 7bb.c:creating "bb.c.gcov" [root@localhost new]# lsa.out    bb.c  bb.c.gcov  bb.gcda  bb.gcno 以下这个文件就是对每行使用次数的统计,很显然“#####”开头的文件根本没被调用过,优化时可以考虑和谐掉他,另外前两项是执行次数和行号。[root@localhost new]# vim bb.c.gcov          -:    0:Source:bb.c        -:    0:Graph:bb.gcno        -:    0:Data:bb.gcda        -:    0:Runs:1        -:    0:Programs:1        -:    1:#include <stdio.h>        -:    2:        -:    3:int main(void)        1:    4:{        -:    5:int i;       10:    6:        for(i=1;i<10;i++)        -:    7:        {        9:    8:                if(i%3 == 0)        3:    9:                        printf("%d is divisible by 3 ",i);        9:   10:                if(i%11 == 0)    #####:   11:                        printf("%d is divisible by 11 ",i);        -:   12:        }        1:   13:        return 0;        -:   14:} [root@localhost new]# grep "#####" bb.c.gcov //一次定位到#####:   11:                printf("%d is divisible by 11 ",i);结束总结:这里学习的GCC编译是一个入门级别的,同时感谢小布老师的无私授课,在这里做笔记为了加深记忆,为了更深入的学习打下基础。附录:第一个g++程序[root@localhost g++]# vim hello.cpp  #include <iostream> int main(){        std::cout << "Hello World!!" << std::endl;        return 0;}[root@localhost g++]# g++ -Wall -O hello.cpp -o hello[root@localhost g++]# ./hello Hello World!!RedHat Enterprise Linux 5.2 解决中文乱码问题Linux下GCC的DEBUG和优化,以及编译过程相关资讯      gcc 
  • gcc: error trying to exec "  (今 06:25)
  • GCC 6.1带来新的C++17特性、完全支  (05月06日)
  • Linux环境下使用GCC编译,GDB反汇  (03月30日)
  • 用GCC进行程序的编译  (06月14日)
  • GNU编译器套件GCC 6.1发布 默认使  (04月28日)
  • 让GCC支持成员函数模板的trick  (03月10日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数


评论声明
    版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图