在效能分析工具 (C#、Visual Basic、C++、F#) 中使用 CPU 分析來分析效能

開始調查應用程式中效能問題的一個好方法是使用 CPU 分析工具來了解其 CPU 使用量。 [CPU 使用量] 效能工具顯示在 C++、C#/Visual Basic 中執行程式碼所花費的 CPU 時間和百分比。

CPU 使用量工具可協助您:

  • 診斷在診斷小組的程式碼基底中速度變慢或處理序無回應。 此工具可協助您診斷有關診斷小組的生產程式碼問題。 此工具提供資料的自動深入解析和各種檢視,以便分析及診斷效能問題。

  • 識別 DevOps 案例中的效能問題,例如當客戶回報某些要求或訂單在尖峰期間未通過零售網站時。 問題通常在生產環境中,而且當下要偵錯很有挑戰性,但是此工具可協助您擷取足夠的問題資訊和辨識項。 收集追蹤檔案之後,分析可協助您快速瞭解潛在原因,並在程式碼內容中提供建議,以便您採取後續步驟來修正問題。

  • 如果您的延遲問題不在 API 要求內,您可以檢查 CPU 使用率是否很高,以及 [CPU 使用量] 工具的其他相關問題。 [CPU 使用量] 工具可協助您找出瓶頸,以便縮小要最佳化的地方。

[CPU 使用量] 工具對於本機追蹤工作階段和生產環境有所幫助。 使用鍵盤快速鍵 Alt+F2,然後選擇 [CPU 使用量],或使用 dotnet-tracedotnet-monitor 之類的工具來開啟已收集的追蹤,也可以起始 [CPU 使用量] 工具。 (針對 .NET 生產程式碼,這很可能是收集追蹤的方式。)

[CPU 使用量] 工具可以在開啟的 Visual Studio 專案上及已安裝的 Microsoft Store 應用程式上執行,或是附加至執行中的應用程式或處理程序。 執行 [CPU 使用量] 工具時不一定需要包含偵錯。 如需詳細資訊,請參閱使用或不使用偵錯工具來執行分析工具

下列指示說明如何使用 [CPU 使用量] 工具而不搭配偵錯工具,並且使用 Visual Studio [效能分析工具]。 範例使用在本機電腦上的 [發行] 組建。 [發行] 組建提供實際應用程式效能的最佳檢視。 如需示範如何使用 CPU 使用量工具改善效能的教學課程,請參閱最佳化程式碼的初學者指南

通常,本機電腦最能充分複製已安裝的應用程式執行。 若要從遠端裝置收集資料,請直接在裝置上執行應用程式,而不要透過遠端桌面連線。

收集 CPU 使用量資料

  1. 在 Visual Studio 專案中,將解決方案組態設定為 [發行] 並選取 [本機 Windows 偵錯工具] (或本機電腦) 做為部署目標。

    顯示 [選取發行] 和 [本機電腦] 的螢幕擷取畫面。

    顯示 [選取發行] 和 [本機電腦] 的螢幕擷取畫面。

  2. 選取 [偵錯]>[效能分析工具]

  3. 在 [可用的工具] 下,選取 [CPU 使用量],然後選取 [啟動]

    顯示 [選取 CPU 使用量] 的螢幕擷取畫面。

    顯示 [選取 CPU 使用量] 的螢幕擷取畫面。

    如果在啟動分析工具之前啟用開始時暫停收集選項,則只有在診斷工作階段檢視中選擇記錄按鈕後才會收集資料。

    注意

    如需如何讓工具更有效率的詳細資訊,請參閱最佳化分析工具設定

  4. 應用程式啟動之後,診斷工作階段會開始,並顯示 CPU 使用量資料。 當您完成收集資料時,請選取 [停止收集]

    顯示停止 CPU 使用量資料收集的螢幕擷取畫面。

    顯示停止 CPU 使用量資料收集的螢幕擷取畫面。

    CPU 使用量工具會分析資料,以及顯示報告。 如果您無法收集或顯示資料,請參閱針對分析錯誤進行疑難排解並修正問題

    顯示 CPU 使用量報告的螢幕擷取畫面。

    顯示 CPU 使用量報告的螢幕擷取畫面。

    使用 [篩選條件] 下拉式清單來選取或取消選取要顯示的執行緒,並使用 [搜尋] 方塊來搜尋特定執行緒或節點。

CPU 使用量資料行

名稱 描述
CPU 總計 [單位, %] 總計 % 資料方程式

在選取的時間範圍內,呼叫函式和該函式所呼叫函式使用的毫秒數及 CPU 百分比。 這與 [CPU 使用率] 時間軸圖表不同,其會將時間範圍內的 CPU 活動總計與可用的 CPU 總計進行比較。
自我 CPU [單位, %] 自我 % 方程式

在選取的時間範圍內,呼叫函式使用的毫秒數及 CPU 百分比,不包含函式所呼叫的函式。
模組 在某些檢視中,[模組] 資料行會顯示,其中顯示包含函式的模組名稱。

分析 CPU 深入解析

若要分析熱門深入解析、熱門函式和最忙碌路徑,請參閱 CPU 深入解析

分析 CPU 利用量

若要分析 CPU 使用量報告,請按一下 [開啟詳細資料],或按一下其中一個熱門函數來開啟 [函數] 檢視。

此報表提供診斷資料的不同檢視:

  • 呼叫者/被呼叫者
  • 呼叫樹狀圖
  • 模組
  • 函式
  • Flame Graph

若要分析報表,請按一下 [建立詳細報表]

此報表提供診斷資料的不同檢視:

  • 呼叫者/被呼叫者
  • 呼叫樹狀圖

在「呼叫者/被呼叫者」以外的所有檢視中,診斷報表的排序是依據 [CPU 總計],從最高到最低。 選取資料行標頭,即可變更排序順序或排序資料行。 您可以按兩下您感興趣的函式,您會看到函式的來源,並醒目提示在該函式中時間花在何處。 資料表會顯示資料行,包含例如函式中花費時間的資料,包括已呼叫函式 (CPU 總計),以及顯示函式所花費時間的第二個資料行,排除已呼叫函式 (自我 CPU)。

這項資料可協助您評估函式本身是否有效能瓶頸。 判斷方法所顯示的資料量,以查看第三方程式碼或執行階段程式庫是否為您的端點速度緩慢或耗用大量資源的原因。

如需使用火焰圖的詳細資訊,請參閱使用火焰圖識別最忙碌路徑

CPU 使用量呼叫樹狀圖

若要檢視呼叫樹狀結構,請在報表中選取父節點。 根據預設,[CPU 使用量] 頁面會開啟至 [呼叫者/被呼叫者] 檢視。 在 [目前的檢視] 下拉式清單中,選取 [呼叫樹狀結構]

您可以按一下 [展開最忙碌路徑] 和 [顯示最忙碌路徑] 按鈕,以查看在呼叫樹狀檢視中使用最高 CPU 百分比的函式呼叫。

呼叫樹狀圖結構

顯示呼叫樹狀結構的螢幕擷取畫面。

顯示呼叫樹狀結構的螢幕擷取畫面。

映像 描述
步驟 1 [CPU 使用量] 呼叫樹狀結構中的最上層節點是一個虛擬節點。
步驟 2 在大部分的應用程式中,已停用 [顯示外部程式碼] 選項時,第二層節點是一個 [外部程式碼] 節點。 節點包含系統和架構程式碼,程式碼會啟動和停止應用程式、繪製 UI、控制執行緒排程,並提供其他低階服務給應用程式。
步驟 3 第二層節點的子系是第二層系統和 Framework 程式碼所呼叫或建立的使用者程式碼方法和非同步常式。
步驟 4 某個方法的子節點只有父方法呼叫的資料。 停用 [顯示外部程式碼] 時,應用程式方法也可包含 [外部程式碼] 節點。

外部程式碼

您程式碼所執行的系統和架構函式稱為「外部程式碼」。 外部程式碼函式會啟動和停止應用程式、繪製 UI、控制執行緒,以及將其他低階服務提供給應用程式。 在大多數情況下,您對外部程式碼並不感興趣,因此 [CPU 使用量] 呼叫樹狀結構會將使用者方法的外部函式,收集成一個 [外部程式碼] 節點。

若要檢視外部程式碼的呼叫路徑,請將目前的檢視切換至 [呼叫樹狀圖] 檢視,或以滑鼠右鍵按一下並選取 [呼叫樹狀圖中的檢視]

顯示 [以呼叫樹狀結構顯示] 的螢幕擷取畫面。

若要檢視外部程式碼的呼叫路徑,在主要診斷報表頁面上 (右窗格),從 [篩選條件] 下拉式清單中選取 [顯示外部程式碼],然後選取 [套用]。 [CPU 使用量] 頁面的 [呼叫樹狀結構] 檢視會展開外部程式碼呼叫。 ([篩選條件] 下拉式清單提供於主要診斷頁面而非詳細檢視上。)

顯示 [顯示外部程式碼] 的螢幕擷取畫面。

許多外部程式碼呼叫鏈結為深度巢狀,因此鏈結的寬度可能會超出 [函式名稱] 資料行的顯示寬度。 然後,函式名稱隨即出現,如下圖所示。

顯示呼叫樹狀結構中巢狀外部程式碼的螢幕擷取畫面。

許多外部程式碼呼叫鏈結為深度巢狀,因此鏈結的寬度可能會超出 [函式名稱] 資料行的顯示寬度。 函式名稱則會顯示為 ...

顯示呼叫樹狀結構中巢狀外部程式碼的螢幕擷取畫面。

若要找到您正在尋找的函式名稱,請使用搜尋方塊。 暫留在選取的行,或使用水平捲軸來檢視資料。

顯示搜尋巢狀外部程式碼的螢幕擷取畫面。

顯示搜尋巢狀外部程式碼的螢幕擷取畫面。

CPU 使用量呼叫樹狀圖中的非同步函式

當編譯器發現非同步方法時,它會建立隱藏的類別來控制方法的執行。 就概念而言,類別是狀態機器。 類別具有編譯器產生的函式,以非同步方式呼叫原始方法,以及若要執行它們所需的回呼、排程器和迭代器。 父方法呼叫原始方法時,編譯器會從父代的執行內容移除該方法,並在控制應用程式執行的系統和架構程式碼內容中執行隱藏類別方法。 非同步方法通常 (但不一定永遠) 會在一個或多個不同的執行緒上執行。 這段程式碼會在 [CPU 使用量] 呼叫樹狀結構中,顯示為樹狀結構最上層節點正下方 [外部程式碼] 節點的子系。

在下列範例中,[外部程式碼] 下的前兩個節點是狀態機器類別的編譯器產生方法。 第三個節點是原始方法的呼叫。

顯示非同步節點的螢幕擷取畫面。

展開所產生方法以顯示正在進行的作業:

顯示展開的非同步節點的螢幕擷取畫面。

顯示展開的非同步節點的螢幕擷取畫面。

  • MainPage::GetMaxNumberAsyncButton_Click 只會管理工作值清單、計算結果的最大值,並顯示輸出。

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext 會顯示排程和啟動將呼叫包裝至 GetNumberAsync之 48 項工作所需的活動。

  • MainPage::<GetNumberAsync>b__b 會顯示呼叫 GetNumber之工作的活動。

收集呼叫計數 (.NET)

如果您想要在 [函式] 檢視中檢視呼叫計數,您可以在啟動分析工具之前啟用設定。 .NET 專案類型支援此設定,而且需要在分析工具下啟動處理序。 不支援連結案例。

  1. 選取 [效能分析工具] 中 [CPU 使用量] 的 [設定] 圖示。

    顯示 CPU 使用量設定圖示的螢幕擷取畫面。

  2. 啟用 [收集呼叫計數 (僅限 .NET)] 選項。

    顯示 CPU 使用量設定的螢幕擷取畫面。

  3. 收集 CPU 使用量資料。

  4. 開啟 [函式] 檢視,然後確定 [呼叫計數] 資料行設定為可見。

    如果您沒看到此資料行,請以滑鼠右鍵按一下資料行標題以選擇可見的資料行。

    顯示呼叫計數資料的螢幕擷取畫面。