用數據來證明效能問題–C++ 效能分析 Profiling v2

用數據來證明效能問題–C++ 效能分析 Profiling

這次我們的主角是 Native C++ 效能問題

 

當團隊都沒有人會寫 _____ 時,又如何來管理和擔任把關的角色

( _____  請自行更換正在管理的開發語言 )

 

這對於專案 owner 通常都是燙手山芋的問題

 

基本上就是 想丟沒辦法!要吃又吞不下去 的囧境

 

這時候很多人會問

 

就直接請開發人員或委外廠商改到好,不就得了?

 

但若是開發人員這個時候說「這個本來就有這個限制」「那你認為那裡有問題?」

 

這時能怎麼辦?沒圖沒真相就沒有辦法請別人修改啊

 

我們來看一下案例 用 C++ 搭配 MDAC ADO 1.5 做資料庫 1000 筆時間要 18 – 27 秒

image

(圖中這次執行的是 27 秒 )

 

到底是慢在那裡啊?有人可以告訴我嗎? ~~~~

 

若是剛好用 .NET、C++ Manage Code、Native C++ 的話

 

我們就可以用 Visual Stuido 來告訴我們啦! ( 其他的語言就要另外找相對應的工具了 )

 

image

開啟工具後選擇「分析」—>「執行效能精靈」 ( 這裡用的工具是 VS 11 Beta ,當然也可以用 VS 2010

 

image

若是想要了解每一個 Method 執行的次數、執行時間,所以可以用「檢測」

所以,這次我們主要會用「檢測 Instrumentation」來分析

 

image

最後會出現「效能總管」再選擇「開始分析」就會將程式啟動

 

image

CPU 效能圖表,工作項目都不超過 40% 這代表 CPU執行的部分沒有最佳化

測試的機器是 4 核心的 ( 程式當中都沒有多執行緒 )

 

image

在 Summary 中列出 那些 Method 是最慢的,可以看到 地址分析最花時間約佔整體的 45%

 

image

另外我們也會想要知道,那些 Method 或是 元件的工作量最重,可以看到這次分析後 MDAC 最花時間

 

從以上報表提供的資訊後,首先當然是先行確認 Hot Path 中的 Method

 

裡面到底執行了那些?所以我們點兩下後便會切換到 Function Details

 

image

這裡提供非常重要的資訊讓我們知道,ParseAddressInner 本身只花了不到 0.1 %

(為了避免電腦執行的差異,所有的數字都用% )

 

而其中 ParseCity 卻佔了 35.6% ,再上方的 ParseCity 區塊點下後

 

又會再切換到 ParseCity 的 Function Details

image

同樣這時就可以立即判斷出來,我們光是在 MDAC 執行 Excute 花費了非常多的時間

佔整體的 35.2 %

 

為了避免我們過於 獨斷的方式來判斷,我們將報表切換到 「Call Tree」

 

image

因為這次程式執行時約會執行 1000 次,而我們在 Call Tree 圖表中也得知

相關的 Method 所執行的次數是否有符合預期

 

的確相關的 method 都分別執行了 1000 次,這時我們再切換到 ParseCity 看看執行的情況

 

image

可以看出來光是 ParseCity 執行 SQL Excute 就做了 3000 次

 

代表每執行 一次 parse city 就分別執行 SQL Excute 三次,雖然有些時候商業邏輯上有必要

 

但這也是造成效能衝擊之一

 

當然點兩下後也是會看到 Hot Path 是那一段程式碼

 

image

 

為了再次證明 Excute 花費的比例造成效能衝擊,我們重新將效能總管的設定改成 CPU Sampling

 

image

同樣的程式再跑一次後就可以看到 那一行程式碼花了多少時間的比例  ( 這個只有 VS 2012 支援)

 

圖中很明細可以看到 Excute 這一行就佔了 17 %

 

這對於我們提出數據證明已經非常有效果了!因為是那一行統統都列出來了

 

希望這些實務問題可以讓一些有同樣問題的朋友降低你們的問題 :)