2012-12-03 37 views
14

我試圖通過去除我不關心的噪聲和計算來剖析(使用Callgrind)我的代碼的特定部分。 這裏是我想要做的一個例子:Callgrind:剖析我的代碼的特定部分

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    //Method to be profiled with these data 
    //Post operation on the data 
} 

我用例是一種迴歸測試,我要確保有問題的方法仍然是速度不夠快(像小於10%的額外自上次實施以來的指示)。 這就是爲什麼我想要清潔輸出形式Callgrind。我需要一個for循環以便處理大量的數據,以便對我想要分析的方法的行爲有一個很好的估計)

我的第一個嘗試是將代碼更改爲:

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_START_INSTRUMENTATION; 
    //Method to be profiled with these data 
    CALLGRIND_STOP_INSTRUMENTATION; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

添加Callgrind宏來控制檢測。我還添加了--instr-atstart = no選項,以確保我只配置了我想要的代碼部分...

不幸的是,使用此配置時,我開始使用callgrind啓動可執行文件,它永遠不會結束......這不是一個緩慢的問題,因爲完整的儀器運行時間不會超過一分鐘。

我也試過

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

(或--toggle-收集=「myMethod的」選項) 但Callgrind返回我的日誌沒有任何呼叫(KCachegrind是像雪一樣白:(並說零個指令...)

我有沒有正確使用宏/選項?什麼,我需要爲了得到預期的結果更改任何想法?

回答

12

我終於設法解決這個問題。這是一個配置問題:

我不停的代碼

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

但隨着--collect-atstart跑callgrind =沒有(並且沒有--instr-atstart =沒有!)和它的工作完美,在合理的時間(〜1分鐘)。

START/STOP檢測問題在於callgrind在每次迭代(每次停止)時都會轉儲一個文件(callgrind.out。#number),因此它非常慢......(5分鐘後,我只有5000次運行30萬次迭代基準...不適合迴歸測試)。

+0

所以你不開始/停止儀器? – Paschalis

+1

@Paschalis開始/停止會在您每次通話結束時創建新的轉儲。如果你想在一個單一的報告中獲得聚合,切換似乎是要走的路(基本上它只是翻轉活動/不活動的儀器)。 – joetde

+0

感謝回覆@joetde。我問,因爲我面臨一個問題,callgrind或其他任何工具的回調/宏似乎並沒有被調用過。更多[這裏](http://goo.gl/08OM3c)! – Paschalis

0

toggle-collect選項對於如何指定用作觸發器的方法非常挑剔。你實際上也需要指定它的參數列表,甚至需要匹配空白符!完全按照它在callgrind輸出中顯示的方法名稱使用。舉例來說,我用這invokation:

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)" 
    ./swaag 

請注意:

  • 圍繞選項的雙引號。
  • 參數列表包括括號。
  • 逗號字符後的空格。