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!!

相关内容