歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下GCC程序優化工具gprof和gcov實例

Linux下GCC程序優化工具gprof和gcov實例

日期:2017/2/28 16:00:34   编辑:Linux教程

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

Copyright © Linux教程網 All Rights Reserved