藉由分析 CPU 使用率來測量應用程式效能(C#、Visual Basic、C++、F#)
當您使用整合在調試器中的 CPU 使用量 診斷工具調試時,找出效能問題。 您也可以分析 CPU 使用量,而不附加調試程式,或以執行中的應用程式為目標。 如需詳細資訊,請參閱 在發行或偵錯組建上執行分析工具 和 使用 CPU 分析來分析效能。
當調試程序暫停時,[診斷工具] 視窗中 CPU 使用量 工具會收集應用程式中執行之函式的相關信息。 此工具會列出正在執行工作的函式,並提供時間軸圖表,讓您可用來將焦點放在取樣會話的特定區段。
重要
在 Visual Studio 中,調試器整合的診斷工具支援 .NET 開發,包括 ASP.NET 和 ASP.NET Core,以及原生/C++ 開發。 需要對應的 Visual Studio 工作負載。 需要 Windows 8 和更新版本,才能使用調試程式執行分析工具(診斷工具 視窗)。
在本教學課程中,您將:
- 收集 CPU 使用率數據
- 分析 CPU 使用率數據
步驟 1:收集 CPU 使用率數據
開啟您想要在 Visual Studio 中偵錯的專案,並在您想要檢查 CPU 使用量的點,在應用程式中設定斷點。
在您要分析之函式或程式代碼區域的結尾設定第二個斷點。
藉由設定兩個斷點,您可以將數據收集限制為您想要分析的程式代碼部分。
除非您已關閉診斷工具,否則 診斷工具 視窗會自動顯示。 若要再次顯示視窗,請按下 [偵錯]>Windows>[顯示診斷工具]。
您可以選擇是否在工具列上的 [選取工具] 設定中看到 CPU 使用量、記憶體使用量或兩者。 如果您執行 Visual Studio Enterprise,您也可以在 Tools>Options>IntelliTrace中啟用或停用 IntelliTrace。
我們主要會查看 CPU 使用率,因此請確定已啟用 CPU 使用量(預設為啟用)。
按一下 [偵錯]>[開始偵錯](或按一下工具列上的 [開始],或按 F5)。
當應用程式完成載入時,[診斷工具] 的 [摘要] 檢視隨即出現。 如果您需要開啟視窗,請按下 [偵錯]>Windows>[顯示診斷工具]。
如需事件的詳細資訊,請參閱 搜尋和篩選 [診斷工具] 視窗的 [事件] 索引標籤,。
執行會觸發第一個斷點的情境。
當調試程序暫停時,請啟用 CPU 使用量數據的集合,然後開啟 [CPU 使用量] 索引標籤。
當您選擇 [記錄 CPU 效能分析時,Visual Studio 會開始錄製您的函式,並記錄各函式執行所需的時間。 當應用程式在斷點暫停時,您只能檢視此收集到的數據。
按 F5 將應用程式執行到您的第二個斷點。
現在,您有應用程式的效能數據資料,特別是針對在兩個斷點之間執行的程式碼區段。
分析工具會開始準備線程數據。 等候它完成。
CPU 使用量工具會在 [CPU 使用量] 標籤中顯示報告。
如果您想要選取要分析的程式代碼更特定區域,請在 CPU 時間軸中選取區域(它必須是顯示分析資料的區域)。
此時,您可以開始分析數據。 如果您無法收集或顯示數據,請參閱 針對分析錯誤進行疑難解答,並修正的問題。
提示
當嘗試識別性能問題時,進行多次測量。 執行效能自然會有所不同,程式碼路徑通常在第一次執行時會比較慢,因為必須進行一次性的初始化工作,例如載入 DLL、JIT 即時編譯方法,以及初始化快取。 進行多次測量,您可以更好地了解所顯示指標的範圍和中位數,這讓您能夠比較程式代碼區域的首次執行與穩定狀態的效能。
步驟 2:分析 CPU 使用率數據
建議您先檢查 CPU 使用量下的函式清單、識別執行最多工作的函式,然後仔細查看每個函式,以開始分析數據。
在函式清單中,檢查執行最多工作的函式。
提示
函式會按順序列出,以執行最多工作的函式開始(它們不是呼叫順序)。 這可協助您快速識別執行時間最長的函式。
在函式清單中,雙擊一個正在處理大量工作的應用程式函式。
當您按兩下功能時,Functions 檢視會在左窗格中開啟。 在下拉選單中選擇 [呼叫者/接聽者 視圖]。
在此檢視中,選擇的函式會顯示在標題和 [當前函式] 方塊中(如本範例中的 DoWork)。 呼叫目前函式的函式會顯示在左側 呼叫函式,而目前函式所呼叫的任何函式都會顯示在右側的 [呼叫函式] 方塊中。 (您可以選取任一方塊來變更目前的功能。)
此檢視會顯示函式運行完成所花費的總時間(毫秒)以及在整體應用程式運行時間中所占的百分比。 函式主體 也會顯示在函式主體中所花費的總時間量(及其時間百分比),不包括在呼叫和被呼叫的函式中所花費的時間。
當您雙擊函式時,呼叫者/被呼叫者 檢視視圖會在左側窗格中開啟。
在此檢視中,選取的函式會顯示在標題和 Current Function 方塊中(在此範例中為 GetNumber)。 呼叫當前函式的函式會顯示在左方的 呼叫函式,而當前函式所呼叫的任何函式則會顯示在右方的 被呼叫函式 方框中。 (您可以選取任一方塊來變更目前的功能。)
此檢視會顯示該函式完成所耗費的總時間(毫秒)以及在整體應用程式運行時間中所佔的百分比。 函式主體 也會顯示函式主體所花費的總時間量(以及時間百分比),不包括呼叫該函式和被該函式呼叫的函式所花費的時間。 (在此範例中,函數主體花費了 2389 毫秒中的 2367 毫秒,其餘 22 毫秒則用於此函式所呼叫的外部程式代碼中)。
小技巧
函式主體 中的高值可能表示函式本身的效能瓶頸。
若要查看顯示呼叫函式順序的較高層級檢視,請從窗格頂端的下拉式清單中選取 [呼叫樹狀結構]。
此圖中的每個編號區域都與程式中的步驟相關。
圖像 描述 CPU 使用量呼叫樹狀結構中的最上層節點,代表應用程式。 在大部分應用程式中,停用 [顯示外部程式代碼] 選項時,第二層節點是 [外部程式代碼] 節點,其中包含啟動和停止應用程式的系統和架構程式代碼、繪製 UI、控制線程排程,以及提供應用程式的其他低階服務。 第二層節點的子系是使用者程式代碼方法和異步例程,由第二層系統和架構程式代碼呼叫或建立。 方法的子節點只包含父方法呼叫的數據。 停用 顯示外部程式碼 時,應用程式方法也可以包含 [外部程式代碼] 節點。 以下是資料行值的詳細資訊:
CPU 總計表示函式及其所呼叫的任何函式已完成多少工作。 高總 CPU 使用率顯示出哪些函式的整體成本最高。
自我 CPU 指出函式主體中的程式代碼已完成多少工作,但不包括由函式所呼叫的函式所完成的工作。 高 自身CPU 值可能表示函式本身的效能瓶頸。
模組 包含函式的模組名稱,或 [外部程式碼] 節點中包含函式的模組數目。
若要在呼叫樹檢視中查看 CPU 使用百分比最高的函式呼叫,請按一下 [展開 [經常性路徑]。 熱門路徑可協助您將調查重點放在影響最大的區域。
注意
如果您在呼叫樹狀結構中看到標示為「損壞」的程式碼或「不可遍歷的堆疊」的程式碼,這表示 Windows 事件追蹤 (ETW) 事件可能已遺失。 請再嘗試收集相同的追蹤記錄以解決問題。
若要查看數據的不同檢視,請從窗格頂端的下拉式清單中選取 [Flame Graph]。
火焰圖提供呼叫樹狀結構的不同視覺效果,可協助您分析數據。 如需詳細資訊,請參閱 使用火焰圖形識別熱路徑。
檢視外部程序代碼
外部程式代碼是系統與架構元件中的函式,由您撰寫的程式代碼所執行。 外部程式代碼包含啟動和停止應用程式的函式、繪製UI、控制線程,以及為應用程式提供其他低階服務。 在大部分情況下,您不會對外部程式碼感興趣,因此 CPU 使用量工具會將使用者方法的外部函式收集到一個 [外部呼叫] 節點。
如果您想要檢視外部程式代碼的呼叫路徑,請從 [ 設定] 清單取消選取 [顯示 Just My Code],然後選擇 [套用]。
外部程式代碼是系統與架構元件中的函式,由您撰寫的程式代碼所執行。 外部程式代碼包含啟動和停止應用程式的函式、繪製UI、控制線程,以及為應用程式提供其他低階服務。 在大部分情況下,您不會對外部程式碼感興趣,因此 CPU 使用量工具會將使用者方法的外部函式收集到一個 [外部程式碼] 節點。
如果您想要檢視外部程式代碼的呼叫路徑,請從 [篩選] 檢視 清單中選擇 [顯示外部程式碼],然後選擇 [套用]。
請注意,許多外部程式碼呼叫鏈結是深度巢狀的,因此函式名稱欄的寬度可能會超過除最大型顯示器以外的所有電腦螢幕的顯示範圍。 發生這種情況時,函式名稱會顯示為 [...]。
使用搜尋方塊來尋找您要尋找的節點,然後使用水平滾動條將數據帶入檢視。
提示
如果您分析呼叫 Windows 函式的外部程式碼,您應確保擁有最新的pdb 檔案。 如果沒有這些檔案,您的報表檢視會列出一些難以理解且晦澀的 Windows 函式名稱。 如需有關如何確定您擁有所需檔案的詳細資訊,請參閱 在調試程式中指定符號 (.pdb) 和來源檔案。
後續步驟
在本教學課程中,您已瞭解如何收集和分析 CPU 使用量數據。 如果您已完成分析工具的
在本教學課程中,您已瞭解如何在偵錯時收集和分析 CPU 使用量數據。 您可能想要深入瞭解使用效能分析工具分析發行組建。