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