WinUI 3 效能優化

本主題說明如何利用 Windows Performance Toolkit 中的效能監控工具,為 WinUI 應用程式製作深入的效能設定檔。

如何使用 Windows Performance Recorder 來監視 WinUI 應用程式?

Windows Performance Recorder (WPR) 可用來根據內建配置檔,建立系統和應用程式行為及資源使用量的詳細Windows 事件追蹤 (ETW) 記錄。 這些 ETW 記錄後可由 Windows Performance Analyzer(WPA) 處理,產生一組圖表與表格,方便使用者更輕鬆地分析 CPU 使用率、電力問題、系統或應用程式效能不佳及其他效能問題。

備註

雖然 WPR 同時有 GUI 和命令行版本,但本主題只參考 GUI 版本(如需這兩個版本的詳細資訊,請參閱 WPR 簡介)。

WPR 設定檔

WPR 設定檔可用來收集應用程式的各個層面和行為的相關信息。

在下圖中,Windows Performance Recorder 視窗會顯示 [CPU 使用量] 配置檔(系統上每個 CPU 的 CPU 使用率)和 [XAML 活動] 設定檔(如 WinUI 等 XAML 相關提供者的事件)。

Windows 效能記錄器螢幕快照,已選取 CPU 使用量和 XAML 活動概況。

如何使用 Windows 效能分析器搭配 WinUI 應用程式?

WinUI 是宣告式、保留模式 API,其中應用程式會描述 UIElements 的樹狀結構,而 WinUI 會執行版面配置並轉譯它。 這會在稱為「幀」的批次中於UI線程上完成,理想情況下,應該在顯示器的一個重新整理間隔內迅速完成。 當幀運行時間過長時,不僅會延遲更新顯示,還會阻止 UI 執行緒處理輸入。 速度緩慢的畫面,雖然不是響應性問題的唯一原因,但是最常見的一個。

安裝「XAML 框架分析」外掛程式

WinUI 會記錄追蹤每個畫面的開始和停止的 ETW 事件(如下列 WPA「一般事件」數據表的螢幕快照所示)。 不過,由於需要手動計算每個畫面的持續時間,因此很難識別畫面發生緩慢的問題。

Windows Performance Analyzer 的螢幕快照,顯示包含一系列畫格開始和結束的通用事件表。

為了解決此問題,Windows評估工具包(ADK)10.1.26100.1 及更新版本中附帶了一個新的「XAML 框架分析」表格外掛。 下表會計算並顯示每個畫面的持續時間(以及其他耗時的作業)。

備註

「XAML 框架分析」表需要 Windows ADK 版本 10.1.26100.1 或更新版本中的 Windows Performance Analyzer(WPA)。 用來追蹤的 WPR 版本並不重要。

安裝 ADK 後,必須透過編輯 WPA 資料夾中的「perfcore.ini」設定檔(通常為 C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit)來啟用「XAML Frame Analysis」表格。 若要這樣做,請關閉 WPA 的任何開啟實例、在文本編輯器中開啟 「perfcore.ini」、新增 perf_xaml.dll 至 dll 清單,然後儲存並關閉檔案。 重新啟動 WPA,它現在應該會顯示 [系統活動] 區段底部的 [XAML 框架分析] 圖形。

Windows 效能分析器 螢幕快照,其中顯示 [系統活動] 區段底部的 [XAML 框架分析] 資料表。

使用「XAML 框架分析」外掛程式

Xaml 框架分析支援兩個檢視(兩個檢視都顯示相同的數據行):

  • 「有趣的 Xaml 框架」(預設值) - 基於啟發式方法顯示那些最有可能造成回應性問題的 WinUI 框架。 這些對應於以 WinUI 初始化、框架導航或快顯視窗顯示等操作開始的區域,並在下一個框架的結束停止。 這些案例通常涉及UIElement樹狀結構的廣泛變更,而且最容易發生效能問題。
  • 「All Xaml Info」— 顯示追蹤中尋找的所有程序的 WinUI 框架。 針對框架或版面配置傳遞等操作,外掛程式會自動計算並根據開始與停止事件顯示持續時間。

下列螢幕快照會醒目提示如何在 Xaml 畫面格分析檢視之間切換。

Windows 效能分析器 的螢幕快照,其中顯示 Xaml 框架分析數據表的檢視選取器。

這兩個 Xaml 框架分析檢視都包含下列資料行:

標題 價值
過程 進程名稱和識別碼
線程標識碼 線程標識碼
類型 描述對應至數據列的事件。 可能的值包括:
  • WXM::InitializeForCurrentThread - 呼叫 WindowsXamlManager.InitializeForCurrentThread。 初始化線程上的 WinUI。
  • DWXS::Initialize - 對 DesktopWindowXamlSource.Initialize呼叫。 初始化 WinUI Island。
  • 框架 - UI 線程上的框架。 執行版面配置,並轉譯自上一個框架以來的樹狀結構變更。
  • 建立圖形裝置 - 建立適用於 WinUI 的 D3D 和 D2D 裝置。 發生在背景執行緒上。
  • UpdateLayout - UI 執行緒上的布局處理。 發生於框架的一部分,但也可以透過 UIElement.UpdateLayout由應用程式觸發。
  • Frame::Navigating - WinUI 會 引發 Frame.Navigating 事件。
  • Frame::Navigated - WinUI 會 引發 Frame.Navigated 事件。
  • Hwnd 焦點 - 作用中的 hwnd 已變更。
  • 相關 區域 - 外掛程式針對有趣案例所計算的區域。 在 WinUI 初始化、框架瀏覽和開啟功能表等事件之後開始。 停止在下一個畫面的結尾。
IsInteresting(是否有趣) 數據列是否被視為有趣。 只有有趣的數據列會顯示在 [有趣的 Xaml 框架] 檢視中。
持續時間 (毫秒) 列的持續時間。 從 [開始] 和 [停止] 事件計算。
權重(毫秒) 對應於持續時間的實際 CPU 運行時間。
開始 (秒) 開始事件的時間
停止 (秒) Stop 事件的時間

數據行可以依 [類型] 或 [持續時間] 排序,以協助識別追蹤中最昂貴、最長持續時間框架等潛在問題(請參閱下圖)。 您也可以深入分析特定行,以識別高成本的操作和潛在的優化措施。

Windows 效能分析器 的螢幕快照,其中顯示 [所有 XAML 資訊] 資料表,依 [持續時間] (ms) 排序。