分析工具鏈

工具鏈會與一定數量的外部工具和子函式庫互動,確切的集合通常取決於使用的編譯和連結器旗標。如果您發現編譯時間異常,或者您正在開發 Emscripten 工具鏈本身,則分析工具鏈在編譯專案時的效能可能會很有用。Emscripten 有一個內建的工具鏈範圍 emprofile.py 分析器,可用於此目的。

快速範例

若要試用工具鏈分析器,請執行下列一組命令

cd path/to/emscripten
export EMPROFILE=1
emcc test/hello_world.c -O3 -o a.html
emprofile

在 Windows 上,請將 export 關鍵字替換為 set。最後一個命令應產生一個 HTML 檔案,格式為 toolchain_profiler.results_yyyymmdd_hhmm.html,可在網頁瀏覽器中開啟以檢視結果。

詳細資訊

每當使用設定的環境變數 EMPROFILE=1 呼叫工具鏈時,工具鏈分析器就會啟動。在此模式下,每個呼叫的工具都會將分析檢測資料累積到 Emscripten 暫存目錄下的一組 .json 檔案中。

分析工具命令

命令 tools/emprofile.py --clear 會刪除所有先前儲存的分析資料。呼叫此命令可將分析工作階段清除為全新的空狀態。若要開始分析,請使用環境變數 EMPROFILE=1 設定 (如範例所示) 或在每個命令的基礎上設定,來呼叫 Emscripten 工具命令,如下所示

emprofile --clear
EMPROFILE=1 emcc -c foo.c a.o
EMPROFILE=1 emcc a.o -O3 -o a.html
emprofile --outfile=myresults.html

可以在一個工作階段中分析任意數量的命令,而當最終呼叫 emprofile 時,它將從到該點為止的所有 Emscripten 工具調用中提取記錄、繪製圖表,並清除記錄的分析資料以進行下一次執行。

可以使用選用的 --outfile=myresults.html 參數來選擇輸出 HTML 檔名。

檢測 Python 指令碼

Python 分析區塊

單獨繪製子處理序開始和結束時間的圖表有時可能會讓您對正在發生的事情的檢視過於粗略。在 Python 程式碼中,可以以階層方式註解個別程式碼區塊,以將執行分解為自訂工作。這些區塊將以藍色顯示在輸出圖表中。若要新增自訂分析區塊,請使用 Python with 關鍵字來新增 profile_block 區段

with ToolchainProfiler.profile_block('my_custom_task'):
  do_some_tasks()
  call_another_function()
  more_code()

this_is_outside_the_block()

這會顯示在分析泳道中以藍色繪製的「my_custom_task」區塊下的相同範圍內的三個函式。

在某些情況下,將程式碼包裝在 with 區段內可能會很麻煩。對於這些情況,也可以使用低階 C 樣式的 enter_blockexit_block 陳述式。

ToolchainProfiler.enter_block('my_code_block')
try:
  do_some_tasks()
  call_another_function()
  more_code()
finally:
  ToolchainProfiler.exit_block('my_code_block')

但是,當使用此形式時,必須小心確保在所有程式碼流程中,每次呼叫 ToolchainProfiler.enter_block() 都會恰好有一個呼叫 ToolchainProfiler.exit_block() 與其對應,因此將程式碼包裝在 try-finally 陳述式中是一個好主意。