第一: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
",m,im); } } return 0;}[root@localhost new]# gcc -Wall -pg aa.c //通过加入-pg的选项实现[root@localhost new]# ./a.out //执行的过程[root@localhost new]# lsa.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
",i); if(i%11 == 0) printf("%d is divisible by 11
",i); } return 0;}[root@localhost new]# gcc -Wall -fprofile-arcs -ftest-coverage bb.c //加上那两个新参数[root@localhost new]# lsa.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]# lsa.out bb.c bb.gcda bb.gcno [root@localhost new]# gcov bb.c //注意是gcov源码文件File "bb.c"Lines executed:85.71% of 7bb.c:creating "bb.c.gcov" [root@localhost new]# lsa.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
",i); 9: 10: if(i%11 == 0) #####: 11: printf("%d is divisible by 11
",i); -: 12: } 1: 13: return 0; -: 14:} [root@localhost new]# grep "#####" bb.c.gcov //一次定位到#####: 11: printf("%d is divisible by 11
",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!!RedHat Enterprise Linux 5.2 解决中文乱码问题Linux下GCC的DEBUG和优化,以及编译过程相关资讯 gcc
- gcc: error trying to exec " (今 06:25)
- GCC 6.1带来新的C++17特性、完全支 (05月06日)
- Linux环境下使用GCC编译,GDB反汇 (03月30日)
| - 用GCC进行程序的编译 (06月14日)
- GNU编译器套件GCC 6.1发布 默认使 (04月28日)
- 让GCC支持成员函数模板的trick (03月10日)
|
本文评论 查看全部评论 (0)