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

应用程序性能度量工具对于想要优化代码和提高应用程序性能的开发人员来说是必不可少的。 Visual Studio 提供了一系列分析和诊断工具,可帮助诊断内存、CPU 使用率以及其他应用程序级别的问题。 借助这些工具,可以在运行应用程序时累积性能数据。 探查器可以通过直观描述应用程序的执行时间和 CPU 使用情况,帮助你快速做出明智的决策。 在本文中,我们将简要介绍最常见的分析工具。

有关选择正确工具的帮助,或查看不同应用程序类型的分析工具支持,请参阅我应该使用哪个工具?有关使用分析工具优化代码的一般方法的教程,请参阅案例研究:初学者代码优化指南

在发行版本中度量性能

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

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

性能探查器的屏幕截图。

性能探查器的屏幕截图。

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

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

若要了解不同应用类型对应的探查工具支持,请参阅我应使用哪个工具?

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

调试时度量性能

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

诊断工具窗口

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

诊断工具窗口

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

诊断工具摘要视图

诊断工具摘要视图

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

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

提示

使用重新启动跳过启动页,并按 Alt+F2 或单击“调试”>“性能探查器”自动使用以前的设置运行。

注意

要运行带调试器的分析工具(“诊断工具”窗口),需具备 Windows 8 及更高版本。

分析 CPU 使用情况

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

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

启用诊断工具中的 CPU 使用情况

启用诊断工具中的 CPU 使用情况

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

“CPU 使用率”视图显示按最长运行时间排序的函数列表,运行时间最长的函数在“排名靠前的函数”下排在最前面。 “热路径”部分显示使用 CPU 最多的函数的调用堆栈。 这些列表有助于将你引导至发生性能瓶颈的函数。

诊断工具 CPU 使用情况视图

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

诊断工具 CPU 使用情况视图

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

提示

Visual Studio 探查器支持收集和查看跟踪。 探查器还可查看其他工具(如 dotnet-trace)先前收集的跟踪。 dotnet-trace 生成采样结果,而不是检测跟踪。 有关详细信息,请参阅 dotnet-trace

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

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

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

分析内存使用情况

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

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

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

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

在诊断工具中拍摄快照

在诊断工具中拍摄快照

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

诊断工具堆差异视图

诊断工具堆差异视图

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

检测

检测工具类似于 CPU 使用率工具,只不过它提供准确的调用计数和时钟时间,而不是 CPU 使用率。 与 CPU 使用率工具相比,检测方法需要更多的开销。 此工具在性能探查器中提供。 选择“调试”>“性能探查器”(或按 Alt + F2)以打开性能探查器。 有关详细信息,请参阅检测

显示 .NET 检测数据的屏幕截图。

检查文件 I/O

文件 I/O 工具可帮助你了解如何优化文件 I/O 操作,以提高应用中的性能。 如果正在尝试调查和诊断加载时间缓慢,则新的文件 IO 工具可帮助你了解 I/O 操作如何影响花费的时间。 此工具在性能探查器中提供。 选择“调试”>“性能探查器”(或按 Alt + F2)以打开性能探查器。

该工具在选项卡式列表视图中显示文件读取和文件写入操作。

显示已停止文件 IO 工具的屏幕截图。

使用 PerfTips 检查性能

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

PerfTips 的屏幕截图。

PerfTips 的屏幕截图。

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

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

诊断工具“事件”视图的屏幕截图。

诊断工具“事件”视图的屏幕截图。

注意

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

分析异步代码 (.NET)

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

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

.NET Async 工具已停止

分析异步代码 (.NET)

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

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

.NET Async 工具已停止

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

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

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

分配

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

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

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

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

检查应用程序事件

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

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

事件查看器跟踪

在时间线图中查看自定义事件

可以通过编程创建自定义事件,这些事件会以图标形式出现在时间线图中,如 CPU 利用率和内存使用率时间线图。 有关详细信息,请参阅在时间线上添加用户标记

分析资源消耗情况 (XAML)

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

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

应用程序时间线分析工具

应用程序时间线分析工具

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

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

检查 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 绑定的性能瓶颈。

分析性能(旧工具)

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

性能资源管理器工具