感谢支持
我们一直在努力

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\n”,m,im);


                }


        }


        return 0;


}


[root@localhost new]# gcc -Wall -pg aa.c   //通过加入-pg的选项实现


[root@localhost new]# ./a.out    //执行的过程


[root@localhost new]# ls


a.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 \n”,i);


                if(i%11 == 0)


                        printf(“%d is divisible by 11 \n”,i);


        }


        return 0;


}


[root@localhost new]# gcc -Wall -fprofile-arcs -ftest-coverage bb.c  //加上那两个新参数


[root@localhost new]# ls


a.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]# ls


a.out    bb.c  bb.gcda  bb.gcno 


[root@localhost new]# gcov bb.c   //注意是gcov源码文件


File ‘bb.c’


Lines executed:85.71% of 7


bb.c:creating ‘bb.c.gcov’


 


[root@localhost new]# ls


a.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 \n”,i);


        9:   10:                if(i%11 == 0)


    #####:   11:                        printf(“%d is divisible by 11 \n”,i);


        -:   12:        }


        1:   13:        return 0;


        -:   14:}


[root@localhost new]# grep “#####” bb.c.gcov //一次定位到


#####:   11:                printf(“%d is divisible by 11 \n”,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!!

赞(0) 打赏
转载请注明出处:服务器评测 » Linux下GCC程序优化工具gprof和gcov实例
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏