2010-10-20 39 views
2

有來源是這樣的:調試C程序慢功能(通過gcc構建)

void foo() { 
    func1(); 
    if(qqq) { 
     func2(); 
    }; 
    func3(); 
    func4(); 
    for(...) { 
     func5(); 
    } 
} 

我想獲得這樣的信息:

   void foo() { 
5 ms; 2 times; func1(); 
0 ms; 2 times; if(qqq) { 
0 ms; 0 times;  func2(); 
0 ms; 2 times; }; 
20 ms; 2 times; func3(); 
5 s ; 2 times; func4(); 
0 ms; 60 times; for(...) { 
30 ms; 60 times;  func5(); 
0 ms; 60 times; } 
       } 

即有關執行該行所花費的平均時間(實際時鐘時間,包括在系統調用中等待)以及執行次數的信息。

我應該使用什麼工具?

我希望該工具儀器各功能來衡量它的運行時間,這是使用儀器內部調用函數寫入日誌文件(或計數在內存中,然後轉儲)。

+0

可以考慮一個稍微不同的期待?當一行代碼處於活動狀態時,它位於堆棧上,因此如果您知道總時間以及一行代碼在堆棧中的時間比例,則知道它需要多長時間。你可以從堆棧樣本中獲得這些信息,並且可以告訴哪些代碼行(和函數,如果你喜歡的話)在經過優化後可以提供最大的收益。 – 2010-10-21 00:40:25

回答

0

Zoom試運行。你不會失望。

P.S.不要期望儀器工作。對於任何一個線路電平或功能級別的信息,牆上時堆棧採樣交付貨物,假設你不絕對需要精確的調用次數(這關係不大的性能)。


ADDED:我在Windows上,所以我只是用LTProf運行你的代碼。輸出看起來是這樣的:

void foo(){ 
5 func1(); 
    if(qqq){ 
5 func2(); 
    } 
5 func3(); 
5 func4(); 
    // I made this 16, not 60, so the total time would be 20 sec. 
    for(int i = 0; i < 16; i++){ 
80 func5(); 
    } 
    } 

其中每個func()做了Sleep(1000)qqq是真,那麼整個事情持續20秒運行一次。左邊的數字是樣本的百分比(6,667個樣本),其中有這條線。因此,例如,對func函數之一的單個調用使用1秒或總時間的5%。所以你可以看到func5()被調用的行使用了總時間的80%。 (也就是說,20秒內有16次)。其他所有的線都比較少,相對而言,它們的百分比都是零。

我會提出不同的信息,但是這應該給什麼堆棧採樣可以告訴你一個道理。

2

gprof的是GNU相當標準的建立(GCC,G ++)程序:http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html

這裏是輸出的樣子:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC5

+0

我沒有在該鏈接上看到帶註釋的源代碼。 – 2010-10-20 21:11:39

+2

註釋源示例:http://sourceware.org/binutils/docs/gprof/Annotated-Source.html – kanaka 2010-10-20 21:28:46

+0

它是否可以計算實際延遲(例如,等待某些輸入),而不是每個事件被調用多少次?我已經嘗試過使用調用usleep(10000)的簡單程序,但gprof未能檢測到延遲。 – 2010-10-20 22:20:43