首先了解 C#、 (Visual Basic、C++、F#) 中的分析工具

Visual Studio 提供了各种分析工具,可依据你的应用类型帮助你诊断不同种类的性能问题。 在本文中,我们将简要介绍最常见的分析工具。

若要了解不同应用类型对应的分析工具支持,请参阅应使用哪一种工具?

调试时度量性能

调试会话期间可以访问的分析工具在“诊断工具”窗口中提供。 将自动显示“诊断工具”窗口,除非你已将其关闭。 若要显示窗口,请依次单击“调试”、“Windows”、“显示诊断工具”(或按 Ctrl + Alt + F2)。 窗口打开后,可以选择想要用于收集数据的工具。

“诊断工具”窗口

“诊断工具”窗口

调试时,你可以使用“诊断工具”窗口分析 CPU 和内存使用情况,并且可以查看显示性能相关信息的事件。

诊断工具“摘要”视图

诊断工具“摘要”视图

“诊断工具”窗口是探查应用的常见方式,但对于版本生成,也可改为对应用执行事后分析。 有关不同方法的详细信息,请参阅运行带或不带调试器的分析工具。 若要了解不同应用类型对应的分析工具支持,请参阅应使用哪一种工具?

“诊断工具”窗口中或调试会话期间提供的工具包括:

备注

要运行带调试器的分析工具(“诊断工具”窗口),需具备 Windows 8 及更高版本。 可以在 Windows 7 及更高版本中使用事后分析工具。

在发行版本中度量性能

性能探查器中的工具旨在提供对发行版本的分析。 在性能探查器中,可以在应用仍在运行时收集诊断信息,然后在应用停止后检查收集的信息(事后分析)。

选择“调试” > “性能探查器”(或按 Alt + F2)以打开性能探查器。

性能探查器

性能探查器

有关如何使用性能探查器中的 CPU 使用率或内存使用率工具与集成了调试器的工具的详细信息,请参阅运行带/不带调试器的分析工具

性能探查器中提供的工具包括:

若要了解不同应用类型对应的分析工具支持,请参阅应使用哪一种工具?

该窗口使你能够在某些应用场景中选择多个分析工具。 CPU 使用率等工具可提供在分析中有所帮助的补充性数据。 还可以使用命令行探查器以启用涉及多个分析工具的方案。

使用 PerfTips 检查性能

通常,查看性能信息的最简单方法是使用 PerfTips。 使用 PerfTips,可以在与代码交互时查看性能信息。 你可以查看事件持续时间(从调试程序上次暂停或应用启动时开始计算)等信息。 例如,如果单步执行代码(F10、F11),PerfTips 将显示自上次单步执行操作到当前单步执行操作的应用运行时持续时间。

分析简介性能提示

分析简介性能提示

使用 PerfTips 可以检查执行代码块所用的时间,也可以检查完成单个函数所需的时间。

PerfTips 与诊断工具的“事件”视图显示相同的事件。 在“事件”视图中,可以查看调试时发生的不同事件,例如设置断点或代码单步执行操作。

诊断工具“事件”视图

诊断工具“事件”视图

备注

如果你有 Visual Studio Enterprise,你还可以在此选项卡中查看 IntelliTrace 事件

分析 CPU 使用情况

CPU 使用率工具很适合用于开始分析应用的性能。 它将向你详细介绍应用正在使用的 CPU 资源。 可以使用集成了调试器的 CPU 使用率工具事后分析 CPU 使用率工具

使用集成了调试器的 CPU 使用率工具时,打开“诊断工具”窗口(如果已关闭,请选择“调试/Windows/显示诊断工具”)。 调试时,打开“摘要”视图,然后选择“记录 CPU 配置文件”。

诊断工具中的“启用 CPU 使用率”

诊断工具中的“启用 CPU 使用率”

使用该工具的一种方法是在代码中设置两个断点,一个在开头,一个在函数的末尾或想要分析的代码区域。 在第二个断点暂停时,请检查分析数据。

" CPU 使用率 "视图显示按运行时间最长的顺序排序的函数列表,运行时间最长的函数位于顶部"Top Functions"下。 " 热路径 "部分显示 CPU 使用率最大的函数的调用堆栈。 这些列表可帮助你了解发生性能瓶颈的函数。

诊断工具“CPU 使用率”视图

“CPU 使用率”视图显示按最长运行时间排序的函数列表,运行时间最长的函数排在前面。 这有助于将你引导至发生性能瓶颈的函数。

诊断工具“CPU 使用率”视图

双击感兴趣的函数,你将看到更详细的"调用树"视图,并突出显示所选函数。 该表显示包含数据(例如函数中花费的时间)的列,包括被调用的函数 (CPU) 总数,以及显示函数中花费的时间的第二列(不包括称为函数 (自 CPU) )。 此数据可以帮助评估函数本身是否属于性能瓶颈。

诊断工具调用方和被调用方“蝶形”视图

双击感兴趣的函数,然后将看到更加详细的三窗格“蝶形”视图,其中所选函数位于窗口中央,调用函数位于左侧,而被调用函数位于右侧。 函数体 部分显示函数体中所用的时间总量(及百分比),其中不包括调用和被调用函数中所用的时间。 此数据可以帮助评估函数本身是否属于性能瓶颈。

诊断工具调用方和被调用方“蝶形”视图

分析内存使用情况

借助“诊断工具”窗口,你还可以使用“内存使用情况”工具来评估应用中的内存使用情况 。 例如,你可以查看堆上对象的数量和大小。 可以使用集成了调试器的内存使用率工具性能探查器中的事后分析内存使用率工具。

.NET 开发人员可以在 .NET 对象分配工具内存使用工具之间进行选择。

  • .NET 对象分配工具可帮助确定 .NET 代码中的分配模式和异常,并帮助确认垃圾回收的常见问题。 此工具仅作为事后分析工具运行。 可以在本地或远程计算机上运行此工具。
  • “内存使用”工具可帮助识别内存泄漏,这在 .NET 应用中通常不常见。 如果需要在检查内存时使用调试器功能,如单步执行代码,则建议使用集成了调试器的内存使用工具。

若要使用 内存使用情况 工具分析内存使用情况,需要拍摄至少一张内存快照。 通常,分析内存的最好方法是拍摄两张快照;一张正好拍摄于发生可疑内存问题之前,另一张拍摄于发生可疑内存问题之后。 然后可以查看两张快照的差异,并发现实际更改的内容。 下图显示了如何使用集成了调试器的工具拍摄快照。

诊断工具中的“获取快照”

诊断工具中的“获取快照”

选择其中一个箭头链接时,系统会提供关于堆的差异视图(一个向上的红色箭头内存使用量增加表明对象计数(左)增加或堆大小(右)增加)。 如果单击右侧的链接,将获得按堆大小增加最多的对象进行排序的差异堆视图。 这可帮助查明内存问题。 例如,在下图中,ClassHandlersStore 对象使用的字节数在第二张快照中增加了 3,492 字节。

诊断工具“堆差异”视图

诊断工具“堆差异”视图

如果改为单击“内存使用量”视图左侧的链接,堆视图将按对象计数排列;数量增加最多的特殊类型的对象显示在顶部(按“计数差异”列排序)。

分析资源消耗情况 (XAML)

在 XAML 应用(例如 Windows 桌面 WPF 应用和 UWP 应用)中,可以使用应用程序时间线工具分析资源消耗情况。 例如,你可以分析应用程序准备 UI 框架(布局和呈现)以及为网络和磁盘请求提供服务所花费的时间,以及在应用程序启动、页面加载以及调整窗口大小等应用场景中花费的时间。 若要使用该工具,请在性能探查器中选择“应用程序时间线”,然后选择“开始”。 在应用中,浏览资源消耗存在可疑问题的应用场景,然后选择“停止收集”生成报表。

可视吞吐量 关系图中的帧速率低可能对应运行应用时看到的视觉问题。 与此类似,UI 线程使用率 关系图中的高数值也可能对应 UI 响应能力问题。 在报表中,你可以选择出现可疑性能问题的时间段,然后在“时间线”详细信息视图(下方窗格)中检查详细的 UI 线程活动。

应用程序时间线分析工具

应用程序时间线分析工具

在时间线详细信息视图中,可以找到活动类型(或涉及的 UI 元素)以及活动持续时间等信息。 例如,在图中,网格控件的 布局 事件需要 57.53 毫秒。

有关详细信息,请参阅应用程序时间线

分析异步代码 (.NET)

.NET 异步工具使你可以分析应用程序中异步代码的性能。 此工具在性能探查器中提供。 选择“调试” > “性能探查器”(或按 Alt + F2)以打开性能探查器。

该工具在列表视图中显示每个异步操作。 可以查看信息,如异步操作的开始时间、结束时间和总时间。

.NET Async 工具已停止

分析异步代码 (.NET)

.NET 异步工具使你可以分析应用程序中异步代码的性能。 此工具在性能探查器中提供。 选择“调试” > “性能探查器”(或按 Alt + F2)以打开性能探查器。

该工具在列表视图中显示每个异步操作。 可以查看信息,如异步操作的开始时间、结束时间和总时间。

.NET Async 工具已停止

检查应用程序事件

使用通用事件查看器,可以通过事件列表(如模块加载、线程启动和系统配置)查看应用程序的活动,以帮助更好地诊断应用程序在 Visual Studio 探查器中的执行情况。 此工具在性能探查器中提供。 选择“调试” > “性能探查器”(或按 Alt + F2)以打开性能探查器。

该工具在列表视图中显示每个事件。 列提供有关每个事件的信息,例如事件名称、时间戳和进程 ID。

事件查看器跟踪

分析数据库性能 (.NET Core)

对于使用 ADO.NET 或 Entity Framework Core 的 .NET Core 应用,可以使用数据库工具记录应用程序在诊断会话期间所进行的数据库查询。 然后,你可以分析各个查询的相关信息,以找到应用性能可改进的地方。 此工具在性能探查器中提供。 选择“调试” > “性能探查器”(或按 Alt + F2)以打开性能探查器。

该工具在列表视图中显示每个查询。 可以查看查询开始时间和持续时间等信息。

Allocation

可视化 .NET 计数器 (.NET Core)

从 Visual Studio 2019 版本 16.7 开始,可以使用 Visual Studio 中的 .NET 计数器工具可视化性能计数器。 可以使用 dotnet 计数器可视化创建的计数器。 dotnet 计数器支持许多计数器,例如 CPU 使用率和垃圾回收器堆大小。

该工具在列表视图中显示每个计数器的实时值。

.NET 计数器工具正在收集数据。

检查 UI 性能和可访问性事件 (UWP)

在 UWP 应用中,可在“诊断工具”窗口中启用“UI 分析” 。 该工具搜索常见的性能和辅助功能问题,在你进行调试时将其显示在“事件”视图中。 事件描述可提供有助于解决问题的信息。

诊断工具中的“视图 UI 分析事件”

诊断工具中的“视图 UI 分析事件”

分析 GPU 使用情况 (Direct3D)

在 Direct3D 应用(Direct3D 组件必须使用 C++)中,你可以检查关于 GPU 的活动并分析性能问题。 有关详细信息,请参阅 GPU 使用情况。 若要使用该工具,请在性能探查器中选择“GPU 使用情况”,然后选择“开始”。 在应用中,浏览你对分析感兴趣的应用场景,然后选择“停止收集”生成报表。

在关系图中选择一个时间段,并选择“查看详细信息”后,下方窗格中将出现详细信息视图。 在详细信息视图中,你可以检查每个 CPU 和 GPU 上发生活动的数量。 选择底部窗格中的事件可在时间线中获得弹出窗口。 例如,选择 Present 事件可查看 Present 调用弹出窗口。 (浅灰色垂直 VSync 线可以作为参考,用于了解某些 Present 调用是否缺少 VSync。 每两个 VSync 之间必须有一个 Present 调用,这样应用才能稳定达到 60 FPS。)

GPU 使用情况分析工具

GPU 使用情况分析工具

关系图还可用于确定是否存在与 CPU 或 GPU 绑定的性能瓶颈。

分析性能 (JavaScript UWP)

对于 UWP 应用,可以使用“JavaScript 内存”工具和“HTML UI 响应能力”工具。

JavaScript 内存工具类似于适用于其他应用类型的内存使用量工具。 你可以使用此工具来了解内存使用量并查找应用中的内存泄露。 有关工具的详细信息,请参阅 JavaScript 内存

JavaScript 内存分析工具

若要对 UWP 应用执行 UI 响应能力、长时间加载和缓慢视觉对象更新诊断,请使用“HTML UI 响应能力”工具。 使用情况类似于适用于其他应用类型的应用程序时间线工具。 有关更多信息,请参阅 HTML UI 响应能力

HTML UI 响应能力分析工具

分析网络使用情况 (UWP)

在 UWP 应用中,可以分析使用 Windows.Web.Http API 执行的网络操作。 此工具可以帮助你解决问题(如访问和身份验证问题、不正确的缓存用法和不良的显示和下载性能)。 若要使用该工具,请在性能探查器中选择“网络”,然后选择“开始”。 在应用中,浏览使用 Windows.Web.Http 的应用场景,然后选择“停止收集”生成报表。

网络使用情况分析工具

在摘要视图中选择一个操作,查看更多详细信息。

网络使用情况工具中的详细信息

有关详细信息,请参阅网络使用情况

分析性能(旧工具)

如果你需要 CPU 使用率或内存使用量工具中当前不存在的功能(如检测),当你在运行桌面或 ASP.NET 应用时,可使用性能资源管理器进行分析。 (UWP 应用中不支持)。 有关详细信息,请参阅性能资源管理器

在 Visual Studio 2019 中,旧的性能资源管理器和相关分析工具(如性能向导)已折叠到性能探查器中,可以使用“调试” > “性能探查器”来打开它们 。 在性能探查器中,可用的诊断工具取决于所选目标和当前打开的启动项目。 CPU 使用情况工具提供先前在性能向导中支持的采样功能。 检测工具提供性能向导中的检测分析功能(用于精确调用计数和持续时间)。 其他内存工具也将出现在性能探查器中。

性能资源管理器工具

应使用哪一种工具?

下表列出了 Visual Studio 提供的不同工具以及适用的不同项目类型:

性能工具 Windows 桌面 UWP ASP.NET/ASP.NET Core
性能提示
CPU 使用率
内存使用率
.NET 对象分配 是(仅用于 .NET)
GPU 使用情况
应用程序时间线 是 (XAML)
事件查看器
.NET Async 是(仅用于 .NET)
.NET 计数器 是(仅限 .NET Core) 是(仅限 ASP.NET Core)
数据库 是(仅限 .NET Core) 是(仅限 ASP.NET Core)
性能资源管理器
IntelliTrace 仅适用于带有 Visual Studio Enterprise 的 .NET 仅适用于带有 Visual Studio Enterprise 的 .NET 仅适用于带有 Visual Studio Enterprise 的 .NET
性能工具 Windows 桌面 UWP ASP.NET/ASP.NET Core
CPU 使用率
内存使用率
GPU 使用情况
应用程序时间线 是 (XAML)
性能提示 XAML 适用,HTML 不适用
性能资源管理器
IntelliTrace 仅适用于带有 Visual Studio Enterprise 的 .NET 仅适用于带有 Visual Studio Enterprise 的 .NET 仅适用于带有 Visual Studio Enterprise 的 .NET
网络使用情况
HTML UI responsiveness HTML 适用,XAML 不适用
JavaScript 内存 HTML 适用,XAML 不适用

请参阅