2012-08-24 47 views
3

我已經看過gprof。但不太明白如何實現以下功能:分析特定功能C++

我寫了一個集羣過程。在每次迭代中,4個函數被重複調用。大約有100000次迭代要完成。我想知道每個功能花了多少時間。
這些函數可能會調用其他子函數,並可能涉及像hashmaps,地圖等數據結構。但我不在乎這些子函數。我只想知道在所有迭代中花費在所有父函數上的總時間。這將幫助我更好地優化我的程序。

gprof的問題是,它分析了每個函數。所以即使是stl數據結構的功能也要考慮在內。

目前我正在使用clock_gettime。對於每個函數,我輸出每次迭代所需的時間。然後我操縱這個輸出文件。爲此,我必須鍵入很多分析代碼。分析代碼使我的代碼看起來非常複雜,我想避免它。這是如何在行業中完成的?

有沒有更簡單的方法來做到這一點?

如果您有任何其他清潔的方式,請讓我知道

+0

通過使用英特爾VTune放大器 – BSen

回答

4

如果我理解正確,那麼您對在感興趣的四個目標函數中花費了多少時間感興趣,但不感興趣那些函數調用的任何子函數。

此信息由gprof的「平面」配置文件在「自我秒」下提供。或者,如果您正在查看調用圖,則此時間位於「自我」列中。

1

我看看telemetry。它主要針對想要比較每幀數據的遊戲開發者,但它似乎非常適合您的需求。

1

你想要這4個功能的自我時間,所以你可以專門優化它們。

gprof會告訴你,佔總時間的百分比。 假設它是10%。如果是這樣,即使您可以將其優化爲0%,您也可以獲得100/90 = 1.11的加速因子或11%的加速比。 如果花了100秒,那太慢了,機會也是90秒也太慢了。

但是,包括(自我加上被調用者)這些函數所花費的時間可能是一個更大的百分比,80%,選擇一個數字。如果是這樣,您可以通過減少對這些被調用者的調用來優化它。或者,你可以發現被調用者花費很大的代價去做一些你並不嚴格需要做的事情,比如爲了一般性而測試他們的參數,在這種情況下你可以用特殊的例程替換它們。

事實上,嚴格地說,沒有自我時間這樣的事情。即使找到程序計數器的最簡單的指令實際上也是對微碼子程序的調用。

Here is some discussion of the issues and a constructive recommendation.