首先查看分析工具(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 使用率 窗口显示按运行时间排序的函数列表,运行时间最长的函数位于 Top Functions顶部。 热路径 部分显示了使用 CPU 最多的函数的调用堆栈。 这些列表可帮助你了解性能瓶颈发生的情况。

诊断工具 CPU 使用率视图

CPU 使用率 视图显示按最长运行时间排序的函数列表,顶部运行时间最长的函数。 这可以帮助你找到造成性能瓶颈的函数。

诊断工具 CPU 使用率视图

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

提示

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

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

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

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

分析内存使用情况

诊断工具 窗口还允许使用 内存使用情况 工具评估应用中的内存使用情况。 例如,可以查看堆上的对象的数量和大小。 可以在性能剖析器中使用 调试器集成的内存使用情况工具事后内存使用情况工具

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

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

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

在诊断工具中拍摄快照

在诊断工具中拍摄快照

选择其中一个箭头链接时,会获得堆的差异视图(红色向上箭头 内存使用量增加 显示增加的对象计数(左)或增大的堆大小(右)。 如果单击正确的链接,则会看到按堆大小增加最多的对象排序的差异堆视图。 这有助于查明内存问题。 例如,在下图中,ClassHandlersStore 对象占用的字节数在第二个快照中增加了3492字节。

诊断工具“堆差异”视图

诊断工具“堆差异”视图

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

仪表

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

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

检查文件输入/输出

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

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

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

使用 PerfTips 检查性能

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

性能提示的屏幕截图。

性能提示的屏幕截图。

可以使用 PerfTips 来检查执行代码块所需的时间,或者单个函数完成需要多长时间。

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

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

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

注意

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

分析异步代码 (.NET)

.NET 异步工具 允许分析应用程序中异步代码的性能。 此工具在性能探查器中可用。 打开性能探查器的方法是选择 “调试”>性能探查器(或按下 Alt + F2)。

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

.NET 异步工具已停止

.NET Core 和 .NET 5+ 应用支持此工具。

分析异步代码 (.NET)

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

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

.NET 异步工具已停止

.NET Core 和 .NET 5+ 应用支持此工具。

分析数据库性能(.NET)

对于使用 ADO.NET 或 Entity Framework Core 的 .NET Core 和 .NET 5+ 应用,数据库工具 允许记录应用程序在诊断会话期间进行的数据库查询。 然后,可以分析有关单个查询的信息,以便查找可以改进应用性能的位置。 此工具在性能探查器中可用。 打开性能分析器,方法是选择 “调试”>性能分析器(或按 Alt + F2)。

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

分配

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

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

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

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

.NET Core 和 .NET 5+ 应用支持此工具。

检查应用程序事件

泛型 事件查看器 允许你通过事件列表(例如模块加载、线程启动和系统配置)查看应用程序的活动,以帮助更好地诊断应用程序在 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 使用情况工具提供以前在性能向导中支持的采样功能。 检测工具提供性能向导中的检测分析功能(用于精确调用计数和持续时间)。 性能分析器中还会显示其他内存相关工具。

性能资源管理器工具