红联Linux门户
Linux帮助

Linux下GCC程序优化工具gprof和gcov实例

发布时间:2014-12-01 15:30:19来源:linux网站作者:ethnicitybeta

第一: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!!