在 Visual Studio(C#、C++、Visual Basic、F#)中检测 .NET 应用程序
随着 Visual Studio 2022 版本 17.5 的发布,你可以使用新的动态检测工具。 此工具显示调用函数的确切次数,并且与早期版本的检测工具相比,此工具的速度更快。 此工具支持 .NET Core 检测,而无需使用 PDB。 从 Visual Studio 2022 版本 17.6 预览版 2 开始,该工具还支持 C/C++。
该工具类似于 CPU 使用情况工具,只不过它基于时钟时间而不是 CPU 使用率。 这意味着,与 CPU 使用情况工具不同,阻塞的时间(如等待锁定的时间)将显示在检测跟踪中。 若要更多地了解如何有效地使用检测工具,请参阅检测概述和案例研究:隔离性能问题。
检测应用程序
选择 Alt+F2(或“调试”>“性能探查器”),在 Visual Studio 中打开性能探查器。
选中“检测”复选框。
如果在启动探查器之前启用了“在暂停后开始收集”选项,则在诊断会话视图中选择“记录”按钮之前,不会收集数据。
备注
如果无法选择该工具,请清除所有其他工具的复选框,因为某些工具需要单独运行。 若要了解有关同时使用工具的详细信息,请参阅 同时使用多个性能分析工具。
如果该工具仍不可用,请检查项目是否满足前面的要求。 请确保项目处于“发布”模式,以便捕获最准确的数据。
选择“开始”按钮,以运行此工具。
选择要检测的程序中的项。
从 Visual Studio 2022 版本 17.11 开始,性能探查器会保留已选择的选项,以供下一次分析运行。
从 Visual Studio 2022 版本 17.13 预览版 1 开始,你可以选择要进行 C++ 检测的项目。
选择“确定”。
在此工具开始运行后,在应用中完成要探查的方案。 然后,选择“停止收集”或关闭应用,以查看数据。
分析检测报告
您的概要分析数据将显示在 Visual Studio 中。
显示 .NET 检测数据的
“工具化数据视图”显示按运行时间从长到短排序的函数列表,最长运行时间的函数位于顶部Top Functions下。 “热路径”部分显示使用时间最多的函数的调用堆栈。 这些列表有助于将你引导至发生性能瓶颈的函数。
单击感兴趣的函数,你将看到更详细的视图。
可用数据类似于 CPU 使用情况工具,只不过它基于时钟时间和调用计数而不是 CPU 使用率。
分析见解
如果 Top Insights 部分中出现任何见解,请使用提供的链接获取有关所发现问题的详细信息。 有关详细信息,请参阅 CPU 见解,但请注意,检测工具的信息基于时钟时间,而不是 CPU 使用率。
此外,如果使用 Copilot,请使用 “询问 Copilot”按钮打开 Copilot 聊天窗口,Copilot 将根据代码检查和任何已识别的问题提供建议。
分析检测详细报表
若要分析检测报表,请单击“打开详细信息”,或单击其中一个排名靠前的函数打开“函数”视图。
报表提供诊断数据的不同视图:
查看 | 描述 |
---|---|
调用方/被调用方 | 有关在特定函数中花费时间、调用该函数的函数以及被该函数调用的函数的详细视图。 性能数据已在数据收集期间聚合。 可以选择调用函数和被调用函数以遍历调用路径。 |
调用树 | 函数调用路径的分层视图。 用于标识占用最多时间(热路径)的调用路径。 |
模块 | 各个模块中所用的时间视图,该时间已在数据收集期间进行汇总。 用于识别可能因为调用次数多和/或性能问题而成为性能瓶颈的模块。 |
函数 | 在数据收集期间,对各个函数所花费时间的总体概览。 用于识别由于高调用次数和/或性能问题而可能成为性能瓶颈的函数。 |
火焰图 | 火焰图可视化中函数调用路径的分层视图。 用于标识占用最多时间(热路径)的调用路径。 |
在除调用方/被调用方之外的所有视图中,诊断报告按“总计 [unit, %]”从最高到最低进行排序。 通过选择列标题更改排序顺序或排序列。 可以双击感兴趣的函数,就能看到该函数的源,并且该函数中所用时间的分布情况会突出显示。 该表显示包含数据(例如函数中所用的时间)的列,其中包括所调用的函数(总计),该表还使用另一列来显示函数中所用时间,其中不包括所调用的函数(自身)。
此数据可以帮助评估函数本身是否属于性能瓶颈。 确定方法显示的数据量,判断第三方代码或运行时库是否是终结点速度慢或资源消耗量大的原因。
有关使用火焰图的详细信息,请参阅使用火焰图识别热路径。
检测调用树
要查看调用关系树,请选择报表中的父节点。 默认情况下,“检测”页面将打开“调用方/被调用方”视图。 在“当前视图”下拉列表中,选择“调用树”。 调用树视图可帮助你快速识别性能瓶颈。
可以单击“展开热路径”和“显示热路径”按钮,以查看调用树视图中使用最多时钟时间的函数调用。
显示呼叫树结构的
下面是有关列值的详细信息:
“总计”表示在该函数及其调用的所有函数中所耗费的总时间。 较高的“总计”值指向消耗最多时钟时间的函数。
“自身”表示在函数体中花费的时间,不包括它调用的任何函数所花费的时间。 较高的“自”值可能指示函数自身内部的性能瓶颈。
“调用计数”指示调用函数的次数。
模块:包含函数的模块的名称。
检测调用树中的异步调用 (.NET)
从 Visual Studio 2022 版本 17.13 预览版 2 开始,表示可视化调用树的视图将 .NET 异步调用嵌套在进行异步调用的函数下,从而更轻松地跟踪单个统一堆栈跟踪中的执行流程。 这有助于快速识别性能瓶颈。
统一堆栈跟踪显示在“调用树”视图和“摘要”页的“热路径”部分。 异步节点与 [异步调用] 描述符一起显示。
可以在探查器的“摘要”视图中的“筛选器”选项中选择“拼接异步堆栈”,以切换已拼接异步调用堆栈的显示。 默认情况下将启用该设置。