【ch9. 程式執行計時與統計資料】
時間是程式執行的主要關鍵,減少程式執行時間,是程式設計時最重要的考慮。
時間是程式執行的主要關鍵,減少程式執行時間,是程式設計時最重要的考慮。
執行績效包含許多層面:實際時間、CPU時間、行程及程式段落的執行次數、I/O佔全部執行時間的比例。
時間統計的方法可分為兩種:
* 簡單計時器:/bin/time (主要是針對整個程式,也可再程式中呼叫計時程序)
* 產生報告的統計程式:gprof 換產生扁平統計和呼叫關係圖表(call graph),它顯示了函式間彼此的呼叫關係和等待時間。
簡單計時
time analyze inputdata outputdata22.3 real 7.1 user 4.5 sys (執行總共花了 22.3 秒,CPU 花了 7.1 秒再使用者空間,4.5 系統呼叫時間,部份為等待時間)
計時統計(gprof)
再使用 gprof 前,gcc必須用 -pg來編譯程式和連結的務建模組。
編譯時, 會再程式中加入指令來追蹤呼叫函式次數、運行時間。連結時,會加入必要的起始設定及統計程序。
gcc -pg a.c b.c -o c ... (會產生 gmon.out,含有一些統計資料,但不是可讀的)
範例 a.c
#include
#include
#include
main()
{
int total;
echo_hello();
total = count_number(1,10000000);
printf("total is %d\n", total);
}
#include
#include
main()
{
int total;
echo_hello();
total = count_number(1,10000000);
printf("total is %d\n", total);
}
範例 b.c
#include
#include
#include
echo_hello()
{
printf("Hello\n");
}
count_number(int a, int b)
{
int i;
long int j;
for ( j=0 ; j <= 100000000 ; j++)
{
for ( i=a ; i<=b ; i++)
{
i+=i;
}
}
return i;
}
gprof {options} {exe_file} {stat_file} > output
gprof c > output
-b (省略說明)
-e name (統計圖中不含 name 程序及 name 的子程序,但執行的時間仍會列入加總)
-E name1,name2 (不列入加總)
-f (只列出 name及後代程序的呼叫關係,報告中仍有其他程序的時間統計)
-F (無其他程序的時間統計)
-s (合併多個 stat-file 為一個,取名 gmon.sum)
-Z (產生從未被呼叫的函是列表)
扁平圖解讀及最佳化
一般來說,計時最久的函式呼叫匯出現在扁平統計最前面,檢視這些函式以增進效率的方向有三:
* 改進函是的演算法
* 改進呼叫的程序,使函是不會被呼叫如此頻繁
* 改寫呼叫者的方式,刪除最常被呼叫的程序 (可用 inline subsitution 解決)
統計圖解讀及最佳化
* 當函式的的 self 大於 childen,是最佳化的好對象* 當函式的的 childen 大於 self,不用改進函式本身,減少呼叫次數或改善費時的資程序
* 當無法改進函適時 (可能他再函式庫裡),察看 called 最高的父程序,並減少呼叫次數
* called 很高時,減少被呼叫的次數。called 很低時嘗試去改進程式
沒有留言:
張貼留言