使用 Firefox OS 內的 Profiler 來測量程式的性能!

本篇作為「在 Firefox OS 裡 如何使用 built-in profiler」[1] 的延續,除了詳細的介紹使用流程外,更要教大家如何在不同的 thread 上測量程式的效能。

Firefox OS 提供內建 profiler 來評估系統效能。此 profiler 會記錄系統執行的時間、函數呼叫的順序以及函數被執行的次數,我們可以利用這些資訊輕鬆的找出系統的瓶頸。

使用方法很簡單,只要在你想要測量的函數中加上 PROFILER_LABEL(…) 這段程式碼,profiler 便會在系統執行時去這些函數中抓取相對應的資訊,當程式結束時便可以使用 Cleopatra [2] 這套軟體來檢閱結果。要注意的是,profiler 只會去抓取被標記函數的資訊, 其餘沒有被標記的函數是不會出現在結果中的。

當 profiler 被啟動時,它會被註冊到 main thread 上,並新增一個 pseudo stack 來存放該 thread 中所有被記錄的資訊。每次呼叫到 PROFILER_LABEL,就會將這些資訊丟到 stack 中,等到 thread 結束時再將這些資訊整理成 profiler 的格式。如果你要測量的函數是在別的 thread 上運行,必須先將 profiler 註冊到該 thread 上,才能抓到你想要的資訊,並在 thread 結束時呼叫將其撤銷註冊並回收這些記錄。

說了這麼多,我們就來實際使用一次吧!

Step1. 設定 profiler

‧開啟.userconfig並加入此編譯指令

Step2. 加入測量 Label

‧在欲測量的函數中加入 PROFILER_LABEL(scope, name, category)

‧前兩個參數填入函數所在的 scope 與名稱,此資訊會出現在 profiler 格式的記錄中

‧依照函數的性質去選擇 category,參數列表可參考 ProfilingStack.h 中的 ProfileEntry

‧PROFILER_LABEL 這個指令實際上會新增一個 SamplerStackFrameRAII 物件,這個物件會將記錄訊息存放在 pseudo stack 中, 當此物件終止時會自動清除 stack 裡的訊息

Step3. 註冊 profiler

‧如果要測量的函數在 main thread 以外的 thread 上運行,必須在該 thread 開始處呼叫 profiler_register_thread(…),結束時呼叫 profiler_unregister_thread()

‧第一個參數是 profiler 的名字, 並不是欲註冊 thread 的名稱

‧一個 thread 上只能註冊一個 profiler,故不可重複呼叫 profiler_register_thread()

‧profiler_register_thread(…) 會將 profiler 註冊到此函數所運行的 thread 上, 如果你想測量"Moz_Thread"這個 thread 上函數的效能, 你就不能在 main thread 呼叫此函數。

‧結束 profiler 時要先確定所有 SamplerStackFrameRAII 都已經被結束,才能呼叫 profiler_unregister_thread(),否則會導致程式錯誤

Step4. 啟動 profiler 並抓取結果

‧./profile.sh start : 開始偵測特定 process

-p : 指定要測量的 process,參數可使用 process name 或 pid
-f : 開啟 profiler 的特定功能,詳細參數列表請見T ableTicker.h::TableTicker()
-t : 設定欲顯示的 threads,名稱不可有空白
-e : 決定 profiler 記錄空間大小,當容量滿的時候, 新的記錄會把舊的洗掉
-i : 可決定 profiler 的 sampling rate

‧./profile.sh ps : 列出所有執行中的 process

‧./profile.sh capture [name or pid] : 抓取特定 process 的 profiling 結果

‧./profile.sh stop : 停止 profiler

‧./profile.sh help : 顯示所有 profiler 的指令

Step5. 檢閱 profiler 結果

我們可以使用 Cleopatra 這套軟體來檢閱 profiler 所產生的 sym 檔,此處以 web 上 media recorder/encoder 的運作為例,來比較不同參數所產生的結果。

※此例中 MediaEncoder 運行於 Media_Encoder thread 中。

(1) 偵測 Browser,不指定其他參數

none

(2) 偵測 Browser,並開啟 multi-threads

可以看到看到許多不同的 threads (GeckoMain, Media_Encoder,Chrome_ChildThread…)

f

(3) 偵測 Browser,開啟 multi-threads,並指定顯示 GeckoMain 與 Media_Encoder

僅顯示 GeckoMain 與 Media_Encoder 的內容,顯示的記錄也正常

f_t

如果指定特定 threads 卻沒有開啟 multi-threads 功能,會顯示出現一些額外且不需要的訊息。

t

參考資料:

[1] 在 Firefox OS 裡 如何使用 built-in profiler

http://tech.mozilla.com.tw/posts/1158/%E5%9C%A8firefox-os-%E8%A3%A1-%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-built-in-profiler-2

[2] Cleopatra

https://github.com/bgirard/cleopatra

[3] Profiling with the built-in profiler

https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Profiling_with_the_Built-in_Profiler

[4] Bug 930444 – [MediaEncoder] Add Profile Label in Encoding path

https://bugzilla.mozilla.org/show_bug.cgi?id=930444

您可能也會喜歡

目前找不到相關文章

對此文章發表回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *