如何分析程序的時間消耗


總結一些常用的方法,思考如何分析一個程序的時間消耗。

 
1.  Trace Log 

這個是大家最常用,也是最簡單和有效地方法。通常是在函數的開始和結束的位置加入Log, 最后通過Log記錄時間統計函數的時間消耗。
有時嫌2次log太麻煩,我們可以通過RAII進行封裝:
class CTimeCostDebug
{
public:
 CTimeCostDebug(LPCTSTR lpszFunName);
 ~CTimeCostDebug()
};
我們在構造函數里記錄開始時間,在析構函數里記錄結束時間以及打印時間消耗。
 
只要這樣用就好了:
int main()
{
    {
        CTimeCostDebug t(_T("test_fun"));
        test_fun();
    }


    return 0;
}
這里時間記錄函數推薦用高精度的QueryPerformanceCounter (曾經嘗試用GetTickCount,結果發現誤差超過10ms).
 
2. WinDbg的!runaway命令

該命令可以打印每個線程的時間消耗:包括用戶模式執行時間,內核模式執行時間以及線程創建到現在的總時間。
通過該命令我們可以分析出哪些線程在空轉消耗時間,然后進行優化
 


3. WinDbg 的 wt 命令

該命令可以幫我們分析目標函數及其子程序執行的指令數,然后幫我們分析該函數的性能消耗分布。
比如我們分析ShowWindow API 的指令消耗, 我們可以看到內部子函數的調用及開銷:
 
 


4. VS  profiler

VS  2010之后自帶性能分析工具Profiler, 該工具可以幫我們對程序運行的性能進行分析。

 


5.  Intel VTune

我用的是  Intel VTune Amplifier XE 2011, 這個工具非常專業,可以在VS2008里使用,幫我們分析程序的熱點開銷和關鍵調用。
 
 
 




總之,根據二八定律,程序運行過程中20%的代碼消耗了80%的時間, 關鍵的問題是找出這20%代碼,然后進行優化。不知道大家還有沒有其他好的性能分析方法?
 
還可以用xperf 

http://www.cppblog.com/weiym/archive/2014/09/16/208335.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM