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