WPF 提供了一套性能分析工具,来帮助您分析应用程序的运行时行为,并确定可以应用的性能优化的类型。下表列出了 Windows SDK 工具 WPFPerf 中包括的五个性能分析工具:
工 具 |
说明 |
---|---|
Perforator(分析器) |
用 于分析呈现行为。 |
Visual Profiler(可视化探查器) |
用 于按可视化树中的元素分析 WPF 服务(如布局和事件处理)的使用情况。 |
Working Set Analyzer(工作集分析器) |
用于分析应用程序的工作集特征。 |
Event Trace(事件跟踪) |
用于分析事件并生成事件日志文件。 |
ETW Trace Viewer(ETW 跟踪查看器) |
以 WPF 用户界面的格式记录、显示和浏览 Windows 事件跟踪 (ETW) 日志文件。 |
本主题包括下列各 节。
安装了 Windows SDK 后,可以选择安装 Windows SDK 性能套件。
说 明: |
---|
在安装该性能套件之前,请移除 WPFPerf.exe 的较旧版本。 |
第 一次运行 WPFPerf 时,会出现“Add Tool” (添加工具)对话框:
选 择要使用的工具,并单击“OK” (确定)。
说 明: |
---|
为了使用性能分析工具,您的用户帐户在运行时必须具有管理访问权限。 |
Perfortor(分析器)是一种用于分析呈现行为的性能分析工具。 Perfortor(分析器)主窗口显示了一组选项,您可以利用这些选项来分析应用程序各部分中非常具体的呈现行为。
您 可以使用 Perfortor(分析器)设置多个选项,这些选项会影响应用程序的实时呈现行为。
选 项 |
说明 |
---|---|
Draw software rendering with purple tint(用紫色色调绘制软件呈现) |
用紫色绘制采用软件呈现管道所呈现的 所有区域。这包括软件呈现目标、软件三维内容以及逐基元软件回退。 |
Clear back-buffer before rendering(呈现之前清除后台缓冲区) |
在每次绘制操作之前清除应用程序 窗口。 |
Show dirty region update overlay(显示已更新区域更新覆盖) |
使 WPF 对屏幕进行的每次更新都通过重新着色进行指示。这样,您将能在应用程序中看到何时在何处重绘了区域。 |
Disable dirty region support(禁用已更新区域支持) |
使 WPF 每当发生更改便重绘整个窗口。通常,只会重绘已更改的窗口部分。启用此选项将使应用程序的呈现速度大为减慢。 |
Disable Opacity effects(禁用不透明度效果) |
禁用某些可能会造成性能下降的不透明度效果。 |
禁 用逐基元软件回退(Disable per-primitive software fallback) |
为各个呈现基元 禁用软件回退。无法禁用软件中间呈现目标和其他软件呈现。 |
禁用高质量图像重新缩放(Disable high-quality image rescaling) |
禁止将大图像重新缩放为较小尺寸。 |
禁 用三维呈现(Disable 3D rendering) |
禁用所有三维呈现操作 |
利用“Enable Debug Control”(启用调试控制) 复 选框,您可以允许或禁止访问 WPF 共享内存。默认情况下,Perfortor(分析器)在启动时会启用此选项,并在终止时禁用此选项。当 Perfortor(分析器)异常终止时,请重新启动 Perfortor(分析器),并手动取消选中“Enable Debug Control”(启用调试控制) 复选框以禁止访问 WPF 共享内存。然后,重新启动 Perfortor(分析器)和所分析的 WPF 应用程序。
说 明: |
---|
在运行 WPF 应用程序时,启用此选项可能会使内存使用量小幅增长,并可能会使性能小幅下降。您应确保 Perfortor(分析器)正确地禁用了此选项。 |
“Enable Debug Control”(启用调试控制) 复选框添加或删除 WPF 注册表项设置。若要手动添加注册表项设置,请从命令窗口中运行以下命令:
reg add HKLM/SOFTWARE/Microsoft/Avalon.Graphics /v EnableDebugControl /t REG_DWORD /d 1 /f
若要手动删除注册表项设置,请从命令窗口中运行以下命令:
reg delete HKLM/SOFTWARE/Microsoft/Avalon.Graphics /v EnableDebugControl /f
若要使用 Perfortor(分析器),请启动您想要分析其呈现行为的 WPF 应用程序。启动了应用程序后,在 Perfortor(分析器)中单击“Refresh”(刷新) 按钮。应用程序现在应出现在 WPF 应用程序的“分析器”(Perforator)列表框中。选择想要分析的应用程序和呈现选项。Perfortor(分析器)数据值(比如帧速率)将立即反 映应用程序的呈现行为。
下 面的屏幕快照显示启用了“Draw software rendering with purple tint”(用紫色色调绘制软件呈现)和“Show dirty region support”(显示已更新区域支持)呈现选项的 PhotoDemo 示例应用程序:
以 下各节讨论呈现中涉及到的主要性能问题,以及如何借助 Perfortor(分析器)选项和数据输出诊断这些问题。
由于 WPF 硬件呈现管道比其软件呈现管道要快很多,因此,用软件呈现的应用程序 UI 越少,该应用程序中的呈现速度就越快。通常,用软件呈现区域所花费的时间与呈现的像素数量成比例,因此,要小心使用软件管道呈现的较大区域;较小的区域影 响不大。
下面是可帮助检测软件呈现问题的 Perfortor(分析器)选项:
Draw software rendering with purple tint(用紫色色调绘制软件呈现): 用紫色绘制采用软件呈现管道所呈现的所有 区域。这包括软件呈现目标、软件三维内容以及逐基元软件回退。
Num Software Render Targets(软件呈现目标数): 计算完全以软件方式运行的全窗口呈现目标的数量。如果计数不为 0,则表示有显著的性能问题(通常与计算机配置或分层窗口的存在有关)。确保启用了 Microsoft Direct3D(运行 dxdiag ),确保所有监视器的位深度都设置为 32每像素位数 (BPP),并确保图形卡受 Microsoft DirectX 9.0 支持。
Num Hardware Render Targets(硬件呈现目标数): 计算以硬件方式运行的全窗口呈现目标的数量。此数量应等于应用程序的窗口数乘以显示适配器数。这指示只要在可 能时就对应用程序使用硬件加速。
中间呈现目标 是 WPF 为了准备好将内容绘制到屏幕上而必须绘制的一些额外的图像。
Maximum SW/HW IRTs per Frame(每帧的最大 SW/HW IRT 数): 显示要应用以呈现应用程序任何一帧的软件或硬件中间呈现目标的最大数量。通常,导致中间呈现 目标出现的原因,是由于对 Visual 使用了 DrawingBrush 、VisualBrush 、Opacity , 或对 TileBrush 使用了平铺模式。如果此数字很大,则可能表明 WPF 运行时正在执行大量的工作来呈现应用程序。
Dirty Rect Addition rate(已更新矩形加入速率): 指示正在应用程序中触发快速更新。
Frame rate(帧速率): 报告应用程序呈现到屏幕的速率。对于没有动画的应用程序,此值应接近于 0,因为已更新区域优化应避免绘制(除非在必要时才绘制)。将此数字视为估计值。
Estimated video memory usage(估计视频内存使用量): 跟踪 WPF 直接进行的大量视频内存分配(纹理和呈现目标)。它不会跟踪给定视频驱动程序在呈现过程中进行的分配、由于编译和加载像素或顶点着色器而导致的分配,或者 顶点或索引缓冲区的分配。请注意,如果超出可用的纹理内存量,将通常会导致 WPF 呈现逻辑变为软件逻辑,并且请注意,多显示器(多监视器)会使应用程序需要的视频内存量成倍增长。
由于 Windows Presentation Foundation (WPF) 只会根据需要更新窗口的各部分,因此,随时显现正在更新的窗口部分将很有帮助。以下选项可帮助显现更新行为。
Show dirty region update overlay(显示已更新区域更新覆盖): 使 WPF 对屏幕进行的每次更新都通过重新着色进行指示。这样,您将能看到何时在运行的应用程序中重绘了哪些区域。
Clear Back Buffer Before Rendering(呈现之前清除后台缓冲区): 在每次绘制操作之前清除窗口。
Disable dirty region support(禁用已更新区域支持): 使 WPF 在任何时候发生任何更改时重绘整个窗口,而不是只重绘已更改的窗口部分。这对于强制更新整个窗口可能很有用,但请注意:启用此选项将导致应用程序的呈现速 度大大减慢。
您可以使用 Perfortor(分析器)禁用某些性能密集型操作,以确定这些操作是否导致应用程序中出现瓶颈。
Disable Opacity effects(禁用不透明度效果): 禁用某些可能会造成性能下降的不透明度效果。为了在总体上避免这种性能问题,请考虑在低 级别对象(比如 Brush ) 上设置不透明度,而不是在高级别对象(比如 Button ) 上设置。
Disable per-primitive software fallback(禁用逐基元软件回退): 为各个呈现基元禁用软件回退。无法禁用软件中间呈现目标和其他软件呈现。
Disable high-quality image rescaling(禁用高质量图像重新缩放): 如果大图像以较小尺寸显示,WPF 会重新缩放大图像以使效果更好。此操作是性能密集型操作,特别是在具有以缩小尺寸在屏幕上显示的许多大图像的应用程序中更是如此。利用此选项可以禁用这种 重新缩放行为,以确定它是否是性能问题的来源。为了避免此行为,请考虑将图像解码为接近图像显示尺寸的大小。
Disable 3D rendering(禁用三维呈现): 禁用所有三维呈现操作。
可视化探查器是一种性能工具,用于按可视化树中的元素分析 WPF 服务(如布局和事件处理)的使用情况。通过分析此工具的分析输出,可以确定应用程序中的哪些可视元素可能引起性能瓶颈。可视化探查器主窗口显示一组选项, 您可以利用这些选项来指定要如何分析应用程序:
Update Interval(更新间隔)。要在分析过程中使用的时间间隔。
Display Overlay(显示覆盖)。显示覆盖选项允许您显示 CPU 资源使用量 — 暗红色的覆盖指示较大的 CPU 资源使用量。
WPF 可视化探查器在基本构造块的上下文中显示性能问题,这些构造块用于在应用程序中构造可视场景。这些构造块包括高级别对象(比如 Button 和 TextBlock 控件)以及低级别对象(比如 Line 和 Ellipse 元素)。可视化探查器使用可视化对象表示形式描述性能问题,而不是用函数名称调用关系图来描述这些问题。此方式与 Windows SDK 工具 UI Spy 表示信息的方式类似。有关更多信息,请参见 UI Spy (UISpy.exe) 。
为了分析各种 WPF 性能问题,必须要了解基础 WPF 服务的角色和范围。这些服务包括布局、呈现和动画。可视化探查器以图形方式呈现 WPF 服务在应用程序对象间的分配方式。例如,当可视化探查器显示应用程序对象的可视化树时,它会在对象上覆盖不同的红色色调,以便表示对象正在使用的相对资源 量。用暗红色覆盖显示的对象表示这样一个对象:它所使用的资源比例比用淡红色覆盖显示的对象高。更重要的是,可视化探查器提供了对象所消耗特定 WPF 资源量的细目分类。
若要使用可视化探查器,请单击“Start Profiling”(开始分析) 按钮,并选择“Launch”(启动) 或“Attach”(附加) 。为了使用“Attach”(附加) 选 项,WPFPerf 和所分析的应用程序都必须以管理访问权限运行。同样,覆盖功能处于禁用状态,因此可用于“Attach” (附加) 选项的事件较少。“Launch”(启动) 选项是推荐选项。
“Events” (事件)选项卡使您能够选择要分析的应用程序和元素事件。
您可以设置可视化探查器配置,以便允许或禁止分析下列应用程序事件。这些事件是由 方法名(后跟括在括号中的类名)表示的方法。例如,“Tick (TimeManager)” 表示 TimeManager.Tick 方法。
应用程序事件 |
说 明 |
---|---|
RenderMessageHandler (MediaContext) |
启 动呈现传递。调用 TimeManager.Tick 和 MediaContext.Render 及其他方法。 |
Rendering Thread |
对呈现线程执行呈 现指令时发生。这对于检测呈现绑定的应用程序十分有用。 |
Layout |
在 度量、排列和呈现传递过程中发生。 |
UpdateRealizations |
在 更新文本和位图效果的内部位图表示形式时发生。 |
Tick (TimeManager) |
在 动画运行时发生。此事件可以触发动画呈现器处理程序。 |
UpdateEffectiveValue (DependencyObject) |
在属性引擎更改 DependencyProperty 的值时发生。 |
Hit Testing |
在命中测试通过时发生,该测 试确定已命中的可视化对象。 |
AnimatedRenderMessageHandler (MediaContext) |
启用了动画后,此处理程序将处理和更新动画,从而导致属性更改,并随后又导致呈现发生。 |
Render (MediaContext) |
在呈现传递过程中发生。此方法最终调用每个元素的 OnRender 方法,并且对于了解所有元素的 OnRender 总开销十分有用。此事件对应于 Visual Studio 探查器 (VSP) 文件中的 MediaContext.Render 方法。 |
FormatLineInternal (TextFormatterImp) |
在设置文本格式时发生。 |
MarkVisibleRealizations (Visual) |
在检测文本的内部位图表示形式以及需要更新位图效果时发生。 |
您 可以设置可视化探查器配置,以便允许或禁止分析下列元素事件:
元 素事件 |
说明 |
---|---|
Layout |
在 度量、排列和呈现传递过程中发生。 |
MarkVisibleRealizations (Visual) |
在检测文本的内部位图表示形式以及需要更新位图效果时发生。 |
UIElement.OnRender |
UIElement 呈现操作。 |
UIElement Layout |
UIElement 布局操作。 |
选择完成应用程序和分析选项后,单击“OK”(确定) 按钮开始分析应用程序。
并排运行应用程序和可视化探查器工具,并注意工具中变化的 值。通过展开可视化树层次结构,您可以选择要分析的特定可视化对象,比如 Grid 控件。可视化探查器的“CPU Usage”(CPU 使用率) 部分使您可以清楚地了解对象和应用程序对 WPF 服务的使用情况。元素的“CPU Utilization”(CPU 使用情况) 数据列出了:
Inclusive Time(非独占时间) :元素及其所有子代的 CPU 使用率。
Exclusive Time(独占时间) :仅显示元素的 CPU 使用率。
可 视化探查器会在可视化树中的对象上覆盖不同的红色色调,以便表示对象正在使用的相对资源量。用暗红色覆盖显示的对象表示这样一个对象:它所使用的资源比例 比用淡红色覆盖显示的对象高。
Working Set Analyzer(工作集分析器)是一种 WPF 性能分析工具,提供有关指定进程的内存使用量信息。利用此工具,您可以生成特定应用程序状态时的应用程序内存使用量信息的快照。
应用程序的工作集是应用程序 的虚拟地址空间中最近被引用的页的集合。它包括共享数据和私有数据。共享数据包括那些包含应用程序执行的所有指令的页(包括您的 DLL 和系统 DLL 中的页)。随着工作集大小的增加,内存需求也会增加。有关工作集的更多信息,请参见进 程工作集 。
虚拟地址转储 (VaDump) 创建一个列表,其中包含有关指定进程的内存使用量的信息。此工具位于以下目录中:
~/Program Files/Microsoft Visual Studio 8/Common7/Tools/Bin/winnt
重 要说明: |
---|
您必须确保系统执行路径包括 VaDump 的目录位置。否则,Working Set Analyzer(工作集分析器)将无法正常工作。 |
若要使用 Working Set Analyzer(工作集分析器),请启动想要分析的 WPF 应用程序。启动了 Working Set Analyzer(工作集分析器)后,请选择“Select Process”(选择进程) 选项:
选 择想要分析其工作集的进程;然后单击“Capture”(捕获) 按钮。Working Set Analyzer(工作集分析器)首先调用 VaDump 来生成内存使用量信息。接着,它分析信息并以包含丰富图形的格式呈现信息。
说 明: |
---|
工作集数据表示内存使用量的静态视图。您可能需要在应用程序中不同的点生成若干组工作集数据,并 比较内存使用量的差异。 |
当工作集数据可供查看时,Working Set Analyzer(工作集分析器)将生成一个表示动态数据、系统数据和应用程序模块的树视图。
对 于 WPF 应用程序,WPF 的“Modules”(模块)类别包含 WPF 的系统特定模块。单击想要显示的类别,将会显示一组饼图。例如,如果单击 WPF 的“Modules”(模块)类别,将会在窗口的左侧显示以下信息。
顶 部的标题显示工作集类别的总大小。在本例中,WPF 模块表示 9160KB 的内存使用量。此饼图表示定义 WPF“Modules”(模块)类别的所有模块的个别内存使用量。
说 明: |
---|
内存使用量类别的大小反映捕获工作集信息时应用程序的内存使用量。 |
小 表格表示共享字节、可共享字节及私有字节的内存使用量。
共 享字节类别表示可能由其他 WPF 应用程序共享的内存量。
若要查看应用程序的内存使用量,请从工作集树视图的“Other Modules”(其他模块)类别中选择可执行文件的名称。
若要保存当前工作集使用情况信息,请从 Working Set Analyzer(工作集分析器)的主菜单中选择“File”(文件)。然后,单击“Save VADump output”(保存 VADump 输出) 按钮。保存了工作集使用情况信息后,您可以通过单击“Capture” (捕获) 按钮生成另一个内存使用量快照。若要重新加载包含 VADump 内容的文件,请从 Working Set Analyzer(工作集分析器)的主菜单中选择“File”(文件)。然后,单击“Open VADump output”(打开 VADump 输出) 按钮。
Working Set Analyzer(工作集分析器)提供了时延功能,您可以利用该功能在指定的时间间隔后捕获工作集使用情况信息。从 Working Set Analyzer(工作集分析器)的主菜单中选择“Actions”(操作) 。然后,单击“Launch Process…”(启动进程…) 按钮。
使用“Browse” (浏览) 按钮(如果需要)指定要运行的应用程序。接着,为应用程序输入任何参数。最后,输入在捕获内存使用量信息前要延迟的秒数。然后,单 击“Launch”(启动) 按钮。Working Set Analyzer(工作集分析器)底部的状态文本将倒数进行捕获之前的剩余秒数,这样将可为您留出时间来修改应用程序的状态。捕获完成后,状态文本将显示 “Done”(完成)。
Windows 事件跟踪 (ETW) 是一种高效的内核级别跟踪工具,它使您能够将内核或应用程序定义的事件记录到日志文件。您可以在实时或从日志文件中使用事件,并使用它们来调试应用程度或 确定应用程序中何处发生了性能问题。WPF 事件跟踪分析工具使用 ETW 来记录事件。有关 ETW 的更多信息,请参见事 件跟踪 。
“Event Trace”(事件跟踪)是 WPF 性能分析工具套件 WPFPerf (WpfPerf.exe) 的一部分。有关更多信息,请参见使 用性能分析工具 部分。
“Event Trace”(事件跟踪)的主窗口显示一组选项,您可以利用这些选项来添加、保存和查看事件日志记录信息:
若要添加新事件记录器,请 从“Event Trace”(事件跟踪)的主窗口中单击“Add”(添加) 按钮。“Add New Logger”(添加新记录器) 对话框显示供您定义的一组信息。“Logger Name”(记录器名称) 指记录器的用户友好名称。从标记为“GUID” 的 下拉列表框中选择下列四种事件记录器之一:
NT Kernel Logger(NT 内核记录器)
Common Language Runtime Garbage Collection(公共语言运行时垃圾回收)
Windows Presentation Foundation - Performance Only(Windows Presentation Foundation - 仅限性能)
Windows Presentation Foundation -All(Windows Presentation Foundation - 全部)
有两种类型的 WPF 事件记录器。“仅限性能”版本是“全部”版本的简化子集。“Log File”(日志文件) 允许您定义 事件日志文件的文件名。单击标记为“…”的按钮定义文件名。事件日志文件使用默认文件扩展名“etl”。
“Level” (级别) 选项是指您可以使用的以下安全级别。较高的数字表示您还可以获取较低的级别。例如,如果您指定 3,则您还会收到所有警告、错误和致命事件:
级 别 |
说明 |
---|---|
1 |
异 常退出或终止事件。 |
2 |
严重错误事件。 |
3 |
诸 如分配失败等警告事件。 |
4 |
非错误事件,比如进入或退出事件。 |
5 |
详 细跟踪事件。 |
“Flags”(标 志) 选项指定 WPF 事件的分类。大多数情况下,默认值就已足够。
创建完新事件日志记录信息后,单击“Add New Logger”(添加新记录器) 对话框的“Add”(添加) 按 钮,以将记录器添加到“Event Trace”(事件跟踪)。可以创建更多事件记录器并将它们添加到“Event Trace”(事件跟踪)。添加完所有事件记录器后,单击“Done”(完成) 按钮。
若 要移除特定事件记录器,请在列表框中选择事件记录器,并单击“Remove”(移除) 按钮。若要移除所 有事件记录器,请单击“Clear”(清除) 按钮。
从“Event Trace”(事件跟踪)主窗口的事件记录器列表中选择事件记录器。单击“Start”(启动) 按钮以 启用日志记录。事件记录器的状态应显示为“Enabled”(启用)。
记 录完应用程序的事件后,单击“Stop”(停止) 按钮。为了确保已捕获了事件日志记录信息,您可能需要 查看事件日志文件。单击“Open Log”(打开日志) 按钮以查看事件日志文件。
事 件日志文件为每个事件列出五列信息。
列 |
说 明 |
---|---|
Time(时间) |
CPU 计时周期中的当前时间。 |
Guid |
对应于事件的 GUID。 |
Name(名称) |
事 件名称。 |
Event Type(事件类型) |
Info、Start 或 End 事件。Start 事件有匹配的 End 事件。 |
Data(数据) |
与 特定事件类型相关的数据。 |
此格式的事件日志信息不十分有用。请使用 WPFETW Trace Viewer (ETW 跟踪查看器)分析工具来分析用“Event Trace”(事件跟踪)创建的事件日志文件的输出。
Windows 事件跟踪 (ETW) 提供了一种机制,用于跟踪和记录用户模式应用程序引发的事件。ETW 在 Windows 操作系统中实现,为开发人员提供了一组快速、可靠而通用的事件跟踪功能。“Event Trace”(事件跟踪)工具允许您用特定于 WPF 的用户界面格式记录、显示和浏览 ETW 日志文件。
您可以使用 WPFEvent Trace (事件跟踪)分析工具来查看创建和保存的 ETW 日志文件。事件日志文件使用默认文件扩展名“etl”。从 ETW Trace Viewer(ETW 跟踪查看器)的主菜单中选择“File”(文件) 。然后,单击“Open”(打开) 加载所需的日志文件。
加 载了日志文件后,ETW Trace Viewer(ETW 跟踪查看器)将显示一条表示事件日志捕获持续时间的时间线。您可以将时间线的度量单位更改为秒或毫秒。通过启用或禁用特定事件类型,您可以选择要查看哪些 类型的事件。如果希望查看少量的事件类型,您可以单击“Disable All”(全部禁用) 按钮以禁 用所有事件,然后单击想要启用的事件的复选框。为时间线启用的事件类型显示在 ETW Trace Viewer(ETW 跟踪查看器)的右下角。
您 可以在时间线上单击并拖动鼠标,以便只查看在时间线的选定区域过程中发生的那些事件。若要放大时间线的选定区域,请右击以显示以下屏幕快照中所示的弹出菜 单。
利 用该弹出菜单可以放大和缩小时间线,以及显示所有事件和清除时间线的当前选定区域。当您放大时间线时,显示为蓝色的时间间隔指示放大的时间线的长度。显示 在下方的黑色时间间隔指示相对于事件日志捕获总体持续时间的时间。
您 可以单击时间线上的小框来显示有关特定事件的信息。
您也可以使用 ETW Trace Viewer(ETW 跟踪查看器)创建 ETW 日志文件,方法是单击“Start capture”(开始捕获) 按钮开始事件日志记录,并单击“Stop capture”(停止捕获) 按钮结束事件日志记录。使用此方法生成的事件记录器不允许自定义用于筛 选事件的设置。使用Event Trace (事件跟踪)工具来创建自定义事件记录器。
Windows Presentation Foundation (WPF) 还支持调试跟踪。
PresentationTraceSources 类为 Windows Presentation Foundation (WPF) 应用程序提供调试跟踪支持。跟踪是一种诊断体系,可以通过该体系来跟踪应用程序的进度。跟踪语句报告信息,就像通常使用 WriteLine 方法一样。但是,可以通过使用配置文件来打开或关闭跟踪语句。此外,还可以自定义跟踪语句的输出。
有关其他相关的 .NET Framework 诊断类,请参见 System.Diagnostics 。