Very Sleepy + Qt Creator mingw 效能測試

當 Project 完成到某一個程度的時候, 很多程式設計師就會(手賤, 手癢)想要替程式做一些最佳化. 前人告訴我們的經驗是:

  1. 先用工具做完效能測量(profiling)再做最佳化
  2. 千萬只對演算法做最佳化, 不要對程式語法做最佳化

至於最佳化不是本篇討論重點, 而且每種程式最佳化策略不同. 如果有興趣的人可以去網上找一下相關討論.

本篇需要對 GCC + QMake 有基礎知識, 不然可能會看不懂我在做甚麼.

工具

Very Sleey

這類效能測量工具很多, 去 Wiki 找就有, 會想用這套的原因有兩個:

  1. 簡單易用
  2. 最新版支援 gcc DWARF 2 格式

GCC

因為我用了很多 open source 的東西, 在 Windows 下最好 porting 的方式是 Mingw-w64 + GNU Make 系統. 所以相對的工具也要採用支援 GCC 的工具.

Qt Creator

目前使用 Qt 最好的選擇. 目前我採用的系統是 Mingw gcc4.8.2 + Qt 5.2.1.

第一步: QMake 編譯選項

QMake 在 Release 模式除了會做 O2 最佳化之外, 還會用 strip 把所有的 debug 資訊給砍光光. 所以第一件事情除了要設定 QMake 加入 profiling 選項之外, 還要讓 QMake 保留這些資訊.

以下是 QMake 的設定:

CONFIG(release, debug|release) {
        QMAKE_CXXFLAGS_RELEASE += -gstrict-dwarf -gdwarf-2 -fno-omit-frame-pointer
        QMAKE_CFLAGS_RELEASE += -gstrict-dwarf -gdwarf-2 -fno-omit-frame-pointer
        QMAKE_LFLAGS_RELEASE =
}

前兩行的設定強迫 gcc 只採用 DWARF2 格式並且不要去除 frame pointer 資訊, 這樣可以精準的取得程式碼位置. 至於第三行的做法是直接強迫清除所有 linking 時候的預設動作. 如果你想要強迫 GCC 採用 O3 最佳化策略, 可以採用下列設定:

QMAKE_CXXFLAGS_RELEASE -= -O1
QMAKE_CFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_CLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE *= -O3
QMAKE_CFLAGS_RELEASE *= -O3

這會幫你移除一些 O1 以及 O2 最佳化並採用 O3 最佳化, 但是 QMake 可能在其他地方會寫死 O1 O2 最佳化. 之後再用 Qt Creator 編譯 Release 模式的程式.

第二步: 安裝 Very Sleepy 並測試程式

請到這裡下載最新的 Very Sleepy, 我目前是使用 0.82 版. 安裝步驟很簡單所以就不再解釋了. 因為 Very Sleepy 不知道 Qt 路徑, 而它的內部也沒有可以設定系統參數的地方, 所以建議先把 Qt 路徑設在系統路徑.

環境設定

假設我的 Qt 是裝在 C:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin 底下.

Windows 7 底下:

控制台 -> 系統 -> 進階系統設定 -> 進階 -> 環境變數 -> xxx 的使用者變數 新增一個欄位

變數名稱: PATH
變數值: C:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin;%PATH%

再來我會把要用到的 DLL 檔複製到程式的工作目錄下, 這部分我是用 QMake script 完成, 有機會我會補充.

啟動 Very Sleepy

開啟 Very Sleepy, 到 File -> Launch…

接下來你會看到一個視窗裡面有兩個欄位.

第一個欄位是程式的路徑. Qt Creator 的習慣是會在你的 .pro 檔的上一層目錄再建一個 build-xxx-debug 或是 build-xxx-release 目錄避免在建置過程汙染你的程式碼目錄. Release 程式是在 build-xxx-release/release 目錄下.

第二個欄位就是你的工作目錄, 按照 Qt Creator 慣例你的工作目錄就是 build-xxx-release 目錄.

選好了之後選 ok 就開始測量了. 在過程中他會跳一個視窗讓你做控制. 你可以隨時按下 ok 結束測量或是等待程式結束. 結束後他就有一個畫面告訴你測量結果. 雖然很陽春, 可是夠用了.

留言

熱門文章