我試圖通過去除我不關心的噪聲和計算來剖析(使用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是像雪一樣白:(並說零個指令...)
我有沒有正確使用宏/選項?什麼,我需要爲了得到預期的結果更改任何想法?
所以你不開始/停止儀器? – Paschalis
@Paschalis開始/停止會在您每次通話結束時創建新的轉儲。如果你想在一個單一的報告中獲得聚合,切換似乎是要走的路(基本上它只是翻轉活動/不活動的儀器)。 – joetde
感謝回覆@joetde。我問,因爲我面臨一個問題,callgrind或其他任何工具的回調/宏似乎並沒有被調用過。更多[這裏](http://goo.gl/08OM3c)! – Paschalis