2008-11-12 96 views

回答

5

我發現以下非常有用:

#ifdef PROFILING 
# define PROFILE_CALL(x) do{ \ 
    const DWORD t1 = timeGetTime(); \ 
    x; \ 
    const DWORD t2 = timeGetTime(); \ 
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \ 
    }while(false) 
#else 
# define PROFILE_CALL(x) x 
#endif 

可以在調用函數被用作這樣的:

PROFILE_CALL(renderSlow(world)); 
int r = 0; 
PROFILE_CALL(r = readPacketSize()); 
+0

我喜歡這樣。可以將其定義爲x;正常運行。 – EvilTeach 2008-11-13 00:50:14

+0

是的,我這樣做,但我忘了把它添加到我的答案。感謝您的提醒。 – 2008-11-13 14:38:50

3

從本質上講,如果剖析工具不可用,那麼您就可以模擬剖析器將會完成的工作。您可以將計數器插入到您認爲有趣的函數中,並計算多少次,並計算它們被調用的大小/種類的參數。

如果你有機會到你的平臺上的所有計時器,您就可以開始/之初/結束阻止這些說函數來獲取執行時間信息爲好,如果這是從代碼不清楚。這將給你在複雜代碼中最大的壓力,因爲通常會有太多的函數來測試它們。相反,您可以通過爲每個代碼分配一個計時器來獲取代碼的某些部分所花費的時間。

這兩種串聯技術可以形成一種迭代方法,您可以在其中找到大量使用定時器消耗大部分循環的代碼,然後以更精細的粒度對各個函數進行處理以磨練問題。

2

如果是東西足夠長的持續時間(例如一分鐘以上),我運行該軟件在調試器則打破了幾次,看看那裏的調試器中斷,這給軟件就是一個非常粗略的想法直到(例如,如果你打破10次,他們都在同一個地方,這告訴你一些有趣的事情!)。 非常粗糙,準備好,但不需要任何工具,儀器儀表等

8

不開玩笑:除傾銷定時到std ::法院和麪向方法我也用了蜂鳴()函數其他文本/數據。聽到兩個「嗶嗶」檢查站之間的沉默間隙有些東西可以讓人產生不同的印象。

這就像看一個書面樂譜,居然聽到了音樂的區別。這就像讀取rgb(255,0,0)和看到消防車紅色之間的差異。

所以,現在我有一個客戶端/服務器應用程序,並使用不同頻率的蜂鳴聲,標記客戶端發送消息的位置,服務器在哪裏啓動應答,完成應答,應答首先進入客戶端等,我可以很自然地感受到時間花在哪裏。

+1

真是個好主意。 – 2008-11-13 00:44:06

1

我會使用80/20法則,把周圍的熱點或有趣的調用路徑定時器。您應該對瓶頸(或至少大部分執行路徑)的位置有一個總體思路,並使用適當的平臺相關高分辨率定時器(QueryPerformanceCounters,gettimeofday等)。

我通常不與任何在啓動或關機(除非需要),並具有明確定義的「咽喉要道」,通常是消息傳遞或某種算法計算的麻煩。我通常發現消息接收器/ srcs(sinks moreso),隊列,互斥鎖和簡單的混亂(算法,循環)通常會佔據執行路徑中的大部分延遲。

2

我不確定你有什麼樣的平臺,但是在嵌入式微控制器上,使用示波器,計數器/定時器或邏輯分析儀來旋轉備用數字輸出線和測量脈衝寬度有時很有用。

1

您是否使用Visual Studio?

您可以使用/ Gh和/ GH開關。 Here's an example involving stack inspection

這些標誌允許您逐個文件地註冊每次輸入方法和/或在運行時留下的未調用函數。

然後,您可以註冊分析信息的所有時間,而不僅僅是時間信息。堆棧轉儲,調用地址,返回地址等。這很重要,因爲您可能想知道'函數X在函數Z下使用了Y時間',而不僅僅是函數X中花費的總時間。

相關問題