在效能分析工具中使用 CPU 分析來分析效能(C#、Visual Basic、C++、F#)
開始調查應用程式中效能問題的好方法是使用 CPU 分析工具瞭解其 CPU 使用率。 Visual Studio 的 CPU 使用率 效能工具會顯示 CPU 在 C++、C#、Visual Basic 中執行程式碼所花費的活動計算時間和百分比。
CPU 使用量工具可協助您:
診斷團隊代碼庫中速度變慢或程序卡住的問題。 此工具可協助您診斷小組的生產程式代碼問題。 它提供數據的自動深入解析和各種檢視,讓您可以分析及診斷效能問題。
識別 DevOps 案例中的效能問題 例如,當客戶回報某些要求或訂單在高峰時段未通過零售網站時,此工具可協助。 問題通常位於生產環境中,且目前難以偵錯,但此工具可協助您擷取問題的信息和證據。 收集追蹤檔案之後,分析可協助您快速了解潛在原因,並在程式代碼內容中提供建議,以便您採取後續步驟來修正問題。
檢查高 CPU 使用率 如果您的延遲問題不在 API 要求內,則可以檢查高 CPU 使用率和其他 CPU 使用量工具的相關問題。 CPU 使用量工具可協助您找出瓶頸,以便縮小優化的位置。
CPU 使用量 工具有助於本機追蹤會話和生產環境。 您可以使用鍵盤快捷方式、Alt+F2來執行 CPU 使用量工具,然後選擇 CPU 使用量,或使用 dotnet-trace 或 dotnet-monitor之類的工具來開啟已收集的追蹤。 (針對 .NET 生產程序代碼,這很可能是收集追蹤的方式。
您可以在開啟的 Visual Studio 專案、已安裝的 Microsoft Store 應用程式或附加至執行中的應用程式或行程上執行 CPU 使用量工具。 您可以在發行或偵錯組建上執行 CPU 使用量工具。 如需詳細資訊,請參閱 在發行或偵錯組建上執行分析工具,。
下列指示示範如何使用不含調試程式的 CPU 使用量工具,並使用 Visual Studio 效能分析工具。 這些範例會使用本機電腦上的發布版本。 釋出版本提供實際應用程式效能的最佳呈現。 如需示範如何使用 CPU 使用量工具來改善效能的教學課程,請參閱 案例研究:將程式代碼優化的初學者指南。
通常,本機最能執行已安裝的應用程式。 若要從遠端裝置收集資料,請直接在裝置上執行應用程式,而不是透過遠端桌面連線。
收集 CPU 使用率數據
在 Visual Studio 專案中,將方案組態設定為 [Release],然後選取 [本機 Windows 調試程式] [或 本機電腦] 作為部署目標。
選取 [[偵錯>效能分析工具]。
在 [可用的工具] 下,選取 [CPU 使用量],然後選取 [開始]。
如果您在啟動分析工具之前啟用「開始時暫停收集」選項,則在診斷會話檢視中選取「記錄」按鈕之前,將不會收集數據。
注意
如需如何讓工具更有效率的詳細資訊,請參閱 優化分析工具設定。
應用程式啟動之後,診斷會話會開始並顯示 CPU 使用率數據。 當您結束收集資料時,請選擇 [停止收集]。
CPU 使用量工具會分析數據並顯示報告。 如果您無法收集或顯示數據,請參閱 針對分析錯誤進行疑難解答,並修正的問題。
使用 [篩選] 下拉式清單來選取或取消選取要顯示的線程,並使用 [搜尋] 方塊來搜尋特定線程或節點。
CPU 使用率數據行
名字 | 描述 |
---|---|
CPU 總計 [單位,%] |
![]() 在選定的時間範圍內,CPU 計算時間的毫秒數,以及函式和被該函式呼叫的函式所使用的 CPU 百分比。 這與時間軸圖表 CPU 使用率 不同,它會比較時間範圍內的總 CPU 活動與可用 CPU 總數。 |
自身 CPU [單位,%] |
![]() 所選時間範圍內的函式呼叫中,CPU 計算時間的毫秒數以及所使用的 CPU 百分比,不包括函式所呼叫的其他函式。 |
模組 | 在某些檢視中,會顯示Module資料行,其中會顯示包含函式的模組名稱。 |
分析 CPU 資訊
如果在 Top Insights 區段中出現任何深入解析,請透過提供的連結瞭解更多有關已識別問題的資訊。 此外,如果您使用 Copilot,Ask Copilot 按鈕會開啟 Copilot 聊天視窗,而 Copilot 會根據您的程式代碼和任何已識別的問題提供建議。
如需詳細資訊,請參閱 CPU 深入解析。
分析 CPU 使用率
若要分析 CPU 使用量報告,請按一下 [開啟詳細數據],或按一下其中一個頂端函式來開啟 Functions 檢視。
此報表提供診斷資料的不同檢視:
檢視 | 描述 |
---|---|
來電者/被呼叫者 | CPU 時間的詳細檢視,涵蓋特定函式、呼叫它的函式,以及它所呼叫的函式。 效能數據會針對數據收集期間進行匯總。 您可以選取呼叫函式和被呼叫函式來遍歷呼叫路徑。 |
呼叫樹 | 函式呼叫路徑的階層式檢視。 用來識別消耗最多 CPU 時間的呼叫路徑(熱點路徑)。 |
模組 | 檢視在資料收集期間匯總的個別模組中花費的CPU時間。 用於識別可能因高呼叫次數和/或效能問題而成為效能瓶頸的模組。 |
功能 | 檢視在數據收集期間匯總的個別函式中所花費的 CPU 時間。 用來識別可能因高呼叫次數和/或效能問題的組合而造成效能瓶頸的函數。 |
火焰圖 | 火焰圖形視覺效果中函式呼叫路徑的階層式檢視。 用來識別佔用最多 CPU 時間的「熱點路徑」。 |
若要分析報表,請按兩下 [建立詳細報表] 。
此報表提供診斷資料的不同檢視:
- 來電者/被呼叫者
- 呼叫樹
在呼叫者/被呼叫者以外的所有檢視中,診斷報告會依 總 CPU排序,從最高到最低。 選取欄位標題以變更排序順序或排序欄位。 您可以按兩下您感興趣的函式,您會看到函式的來源,並反白顯示該函式所花費的時間。 數據表顯示一些數據欄,例如花在函式中的時間,包括被呼叫的函式(CPU 總計),以及第二個數據欄顯示花在函式中的時間,但不包括被呼叫的函式(Self CPU)。
此數據可協助您評估函式本身是否為效能瓶頸。 判斷方法所顯示的數據量,以查看第三方程式代碼或運行時間連結庫是否是您端點速度緩慢或耗用大量資源的原因。
如需使用 Flame 圖形的詳細資訊,請參閱 使用 Flame Graph 識別熱路徑。
CPU 使用量呼叫樹
若要檢視呼叫樹狀結構,請選取報表中的父節點。 根據預設,CPU 使用量 頁面會開啟至 呼叫端/被呼叫者 模式。 在 [目前檢視] 下拉式清單中,選取 [呼叫樹狀結構]。
您可以按下 [展開經常性路徑],[顯示經常性路徑] 按鈕,以查看在呼叫樹視圖中使用最高 CPU 百分比的函數調用。
呼叫樹狀結構
圖像 | 描述 |
---|---|
![]() |
CPU 使用量呼叫樹狀結構中的最上層節點,代表應用程式。 |
![]() |
在大部分應用程式中,停用 [顯示外部程序代碼] 選項時,第二層節點會是 [外部程式碼] 節點。 節點包含啟動和停止應用程式的系統和架構程式代碼、繪製UI、控制線程排程,以及為應用程式提供其他低階服務。 |
![]() |
第二層節點的子系是使用者程式代碼方法和異步例程,由第二層系統和架構程式代碼呼叫或建立。 |
![]() |
方法的子節點只有父方法呼叫的數據。 停用 顯示外部程式碼 時,應用程式方法也可以包含 [外部程式代碼] 節點。 |
外部程序代碼
您的程式碼所執行的系統和架構功能被稱為 外部程式代碼。 外部程式代碼函式會啟動和停止應用程式、繪製UI、控制線程,以及為應用程式提供其他低階服務。 在大部分情況下,您對外部程式代碼並不感興趣,因此 CPU 使用量呼叫樹狀結構會將使用者方法的外部函式收集到一個 [外部呼叫] 節點。
若要檢視外部程式代碼的呼叫路徑,請在主報表摘要頁面(右窗格)上,從 [ 設定] 下拉式清單中取消選取 [顯示 Just My Code],然後選取 [套用]。 (主要報表摘要頁面上提供 [設定] 下拉式清單,而非詳細檢視。
您的程式碼所執行的系統和架構功能被稱為 外部程式代碼。 外部程式代碼函式會啟動和停止應用程式、繪製UI、控制線程,以及為應用程式提供其他低階服務。 在大部分情況下,您對外部程式代碼並不感興趣,因此 CPU 使用量呼叫樹狀結構會將使用者方法的外部函式收集到一個 [外部程式碼] 節點。
若要檢視外部程式代碼的呼叫路徑,請在主要診斷報表頁面(右窗格)上,從 [篩選] 下拉式清單中選取 [顯示外部程式代碼],然後選取 [套用 ]。 CPU 使用量 頁面的 呼叫樹 檢視,然後展開外部程式碼呼叫。 (主要診斷頁面上提供 [濾鏡] 下拉式清單,而非詳細檢視。)
當您停用 [顯示僅我的代碼 ]時,呼叫樹 在 CPU 使用量 頁面中會展開外部程式碼呼叫。
許多外部程式代碼呼叫鏈結都是深度巢狀的,因此鏈結的寬度可能會超過 函數名稱 數據行的顯示寬度。 然後,函式名稱隨即出現,如下圖所示。
許多外部程式代碼呼叫鏈結都是深度巢狀的,因此鏈結的寬度可能會超過 函數名稱 數據行的顯示寬度。 然後,函式名稱會顯示為 ...。
若要尋找您要尋找的函式名稱,請使用搜尋方塊。 將滑鼠停留在選取的線條上,或使用水平滾動條來檢視數據。
CPU 使用量呼叫樹中的異步函式
當編譯程式遇到異步方法時,它會建立隱藏類別來控制方法的執行。 就概念上講,類別是狀態機器。 類別具有編譯程式產生的函式,可異步呼叫原始方法,以及執行它們所需的回呼、排程器和反覆運算器。 當父方法呼叫原始方法時,編譯程式會從父系的執行內容中移除 方法,並在控制應用程式執行的系統和架構程式代碼內容中執行隱藏的類別方法。 異步方法通常是在一或多個不同線程上執行,但並非一律執行。 此代碼會出現在 CPU 使用量 呼叫樹中,作為緊隨樹頂節點之後的 [外部程式碼] 節點的子節點。
在下列範例中,[外部程序代碼] 底下的前兩個節點 是狀態機器類別的編譯程式產生方法。 第三個節點是原始方法的呼叫。
展開產生的方法,以顯示發生什麼事:
MainPage::GetMaxNumberAsyncButton_Click
僅管理任務值列表,然後計算結果的最大值,並顯示輸出。MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext
顯示了需要安排和啟動用於包裹呼叫GetNumberAsync
的 48 項任務的活動。MainPage::<GetNumberAsync>b__b
顯示呼叫GetNumber
的工作活動。
收集通話計數 (.NET)
如果您想要在 Functions 檢視中檢視呼叫計數,您可以在啟動分析工具之前啟用設定。 .NET 專案類型支援此設定,而且需要在分析工具下啟動程式。 不支援所附場景。
選取 [效能分析工具] 中 CPU 使用量的 設定 圖示。
啟用 收集呼叫計數(僅限.NET) 選項。
收集 CPU 使用量數據。
開啟 [函式] 檢視,然後確定 [呼叫計數] 資料欄設為可見。
如果您沒有看到數據行,請以滑鼠右鍵按下資料行標題,以選擇可見的數據行。