分享方式:


在 Visual Studio 中檢測 .NET 應用程式 (C#、C++、Visual Basic、F#)

使用 Visual Studio 2022 17.5 版,您可以使用新的動態檢測工具。 此工具會顯示呼叫函式的確切次數,且速度比舊版檢測工具快。 此工具支援 .NET Core 檢測,不需要 PDB。 從 Visual Studio 2022 17.6 版 Preview 2 開始,工具也支援 C/C++。

此工具類似於 CPU 使用量工具,不同之處在於它是以時鐘時間為基礎,而不是以 CPU 使用率為基礎。 這表示例如等候鎖定所花費時間的封鎖時間會顯示在檢測追蹤中,不像 CPU 使用量工具。 如需了解如何有效使用檢測工具的其他資訊,請參閱檢測設備概觀以及使用新型檢測工具改善 Visual Studio 效能

檢測應用程式

  1. 選取 Alt+F2 (或 [偵錯] > [效能分析工具]),以在 Visual Studio 中開啟效能分析工具。

  2. 選取 [檢測] 核取方塊。

    顯示所選檢測工具的螢幕擷取畫面。

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

    注意

    如果此工具無法進行選取,請清除所有其他工具的核取方塊,因為某些工具需要單獨執行。 若要深入了解一起執行工具,請參閱同時使用多個分析工具

    如果工具仍然無法使用,請檢查您的專案是否符合上述需求。 請確定您的專案處於「發行」模式,以擷取最精確的資料。

  3. 選取 [開始] 按鈕以執行此工具。

  4. 選取程式中要檢測的項目。

    顯示 [選取要檢測的項目] 對話方塊的螢幕擷取畫面。

    從 Visual Studio 2022 17.11 版 Preview 1 開始,分析工具會保存選取的項目用於下一次分析執行。

  5. 選取 [確定]。

  6. 工具開始執行之後,請瀏覽應用程式中您想要分析的情節。 然後選取 [停止收集] 或關閉應用程式以查看資料。

分析檢測報表

您的分析資料會出現在 Visual Studio 中。

顯示 .NET Instrumentation 資料的螢幕擷取畫面。

檢測資料檢視會顯示一份執行時間最長的函式清單,並將執行時間最長的函式放在 [前幾大函式] 底下的最上方。 [最忙碌路徑] 區段會顯示使用最多時間之函式的呼叫堆疊。 這些清單可協助引導您找出發生效能瓶頸的函式。

按一下感興趣的函數,您會看到更詳細的檢視。

可用資料類似於 CPU 使用量工具,不同之處在於它是以實際時間和呼叫計數為基礎,而不是以 CPU 使用率為基礎。

分析見解

如果在 [主要深入解析] 區段中出現任何深入解析,請使用提供的連結獲取有關識別問題的更多資訊。 如需詳細資訊,請參閱 CPU 深入解析,但請注意,檢測工具的資訊是特定於實際時間,而非 CPU 使用量。

此外,如果您有使用 Copilot,請使用 [詢問 Copilot] 按鈕來開啟 Copilot 聊天視窗,Copilot 將根據您的程式碼檢查和已識別的問題提供建議。

分析檢測詳細報告

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

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

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

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

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

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

檢測呼叫樹狀圖

若要檢視呼叫樹狀結構,請在報表中選取父節點。 根據預設,[檢測] 頁面會開啟至 [呼叫者/被呼叫者] 檢視。 在 [目前的檢視] 下拉式清單中,選取 [呼叫樹狀結構]。 呼叫樹狀檢視可協助您快速識別效能瓶頸。

您可以按一下 [展開最忙碌路徑][顯示最忙碌路徑] 按鈕,以查看在呼叫樹狀檢視中使用最久實際時間的函式呼叫。

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

以下是關於資料行值的詳細資訊︰

  • [總計] 表示函式及其呼叫的任何函式中花費的時間。 高總計值指向那些消耗最多實際時間的函式。

  • [自我] 表示在函式本體中花費的時間,不包括函式呼叫其他函式所花費的時間。 [自我] 值高可能表示函式本身內有效能瓶頸。

  • [呼叫計數] 表示呼叫函式的次數。

  • [模組] 包含函式的模組名稱。