總結一些常用的方法,思考如何分析一個程序的時間消耗。
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%代碼,然后進行優化。不知道大家還有沒有其他好的性能分析方法?
posted on 2014-09-16 23:37
Richard Wei 閱讀(7884)
評論(2) 編輯 收藏 引用 所屬分類:
Tool