使用 LCOV 理解 PGO 報告

在此,您將學習如何藉助基於 LCOV 的工具分析 PGO 設定檔。

設定檔導向最佳化 (PGO) 可協助您最大化原生應用程式的效能。 作為 PGO 流程的一部分,您會建立一個檢測過的二進位檔,並在其上執行工作負載,以產生 PGO 設定檔檔案,然後可以將該檔案回饋到建置流程中,以產生應用程式的最佳化二進位檔。 通常,您不需要了解 PGO 設定檔的內容。 但是,在某些情況下,您可能想要了解已記錄為設定檔一部分的內容,尤其是在最佳化二進位檔的效能有問題時。 GraalVM Native Image 可以在 LCOV 格式的附加檔案中匯出設定檔資訊。 您可以在任何支援 LCOV 格式的 IDE 或工具中開啟和視覺化此類檔案。 這可讓您查看程式碼的哪些方法被呼叫以及呼叫的頻率。

Graal 編譯器會花費更多時間最佳化熱方法,即被多次呼叫的方法,而不是冷方法,即僅被呼叫幾次或根本未被呼叫的方法。 因此,您可以使用額外的 LCOV 匯出來檢查在檢測過的二進位檔上執行的工作負載中實際呼叫了哪些方法。 這也表示 PGO 設定檔包含適用於這些方法的適當設定檔資訊。 此外,覆蓋率視覺化可協助您識別應用程式的熱方法,同樣適用於在檢測過的二進位檔上執行的工作負載。 如果您想要最大化效能,這些通常是您想要仔細查看的方法。 相反地,完全沒有覆蓋的方法是清理的潛在候選,這反過來可以加快建置時間。

建立覆蓋率報告 #

若要建立覆蓋率報告,您首先需要在建置檢測過的二進位檔時,傳遞 -H:+ProfilingLCOV 實驗性選項以及 --pgo-instrument 選項。 例如

native-image -cp . GameOfLife -o gameoflife-instrumented --pgo-instrument -H:+UnlockExperimentalVMOptions -H:+ProfilingLCOV -H:-UnlockExperimentalVMOptions

然後,在執行檢測過的應用程式後,會隨設定檔產生 .info 追蹤檔案形式的報告。 以類似設定檔的方式,可以透過 -XX:ProfilesLCOVTraceFile 選項額外自訂產生的 info 檔案的目的地。 例如

./gameoflife-instrumented -XX:ProfilesLCOVTraceFile=gameoflife-coverage.info

產生的 LCOV 追蹤檔案會提供方法層級的覆蓋率資訊,也就是說,特定方法是否已執行 (以及執行了多少次)。 可以使用 lcov 命令輕鬆彙總此資訊 (請參閱官方 LCOV 手冊頁面)。 例如

lcov --summary gameoflife-coverage.info

這會以格式輸出簡短摘要

Summary coverage rate:
  lines......: 17.3% (24873 of 144172 lines)
  functions..: 15.6% (2390 of 15285 functions)
  branches...: no data found

此外,若要視覺化資料,可以使用 genhtml 公用程式 從 LCOV 資料建立 HTML 報告,或使用任何第三方 LCOV 資料視覺化工具 (例如,LCOV viewer 專案)。

若要顯示已檢測 (已找到) 和已執行 (已命中) 的方法,genhtml 還會額外使用來源檔案 (如果無法使用,也可以使用 --synthesize-missing 選項省略)。 此外,如果來源檔案位於特定目錄中,--source-directory 選項會很有用。 例如

genhtml --source-directory *absolute-path-to-sources* gameoflife-coverage.info

請參閱下方範例來源檔案檢視,該檢視來自先前命令產生的 gameoflife-coverage.info 追蹤檔案的報告

LCOV Genhtml Report - Source View

此外,functions 檢視會列出特定來源檔案中找到的所有方法及其執行次數

LCOV Genhtml Report - Functions View

延伸閱讀 #

與我們聯繫