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