如何对WPF 4.5 UI性能进行剖析?

26

我正在开发一个.NET 4.5 WPF应用程序,并遇到UI渲染性能问题。

经过一些谷歌搜索,我找到了WPF Performance Suite页面,描述了我需要的工具 - Visual Profiler。它允许查看WPF元素树并分析每个元素对总渲染时间的贡献。

唯一的问题是,页面说明该工具包含在针对Windows 7和.NET 4.0的Microsoft Windows SDK v7.1中。

由于我的应用程序是针对.NET 4.5的,而且我使用的是Windows 8.1,因此我安装了Windows SDK for Windows 8.1。令我惊讶的是,它似乎根本没有包含WPF性能套件和特定工具。

然后,我尝试从这个答案中安装WPF Performance Suite,但它只适用于.NET 4.0应用程序。

那么,在哪里获取.NET 4.5应用程序的WPF性能套件?
或者更一般地说,如何分析WPF UI渲染性能以找出树中对复杂UI具有最高性能影响的元素?


你有这些开始菜单快捷方式吗:Windows Kits | Windows Performance Toolkit | Windows Performance Analyzer 和 Recorder吗?那就是我所拥有的,虽然我在我的Win7盒子上有更新的Win 10 SDK。也许这个套件已经改名了。 - Chris O
@ChrisO:是的,我有那些快捷键。我尝试使用启用了XAML Activity和XAML App Analysis附加配置文件的Windows Performance Recorder创建指标。但是当我在Windows Performance Analyzer中打开指标时,我看不到与XAML指标相关的任何内容,只有像存储、内存等常规指标。您知道如何使用这两个应用程序来获取WPF元素树指标,而不是使用Perforator和Visual Profiler吗? - Alexander Abakumov
不,我没有,尽管帮助菜单显示了一个指向Windows性能工具包论坛的链接,你在那里可能会有更好的运气。 - Chris O
@ChrisO:明白了,谢谢!我会试一下的! - Alexander Abakumov
1
@PhilipRieck:没错。但是,如果你按照“安装WPF性能套件”部分中的Windows SDK下载页面链接,它会带你到Microsoft Windows SDK for Windows 7 and .NET Framework 4页面,安装后,你会发现这些工具确实只适用于.NET 4.0。我不知道为什么标记为适用于.NET 4.5应用程序。 - Alexander Abakumov
显示剩余7条评论
2个回答

37

最终,我找到了一款我一直在寻找的工具,对我非常有帮助。

为了明确渲染WPF布局瓶颈的位置,您需要:

  1. 安装 Visual Studio 2015(如果您还没有) :)
  2. 转到 Debug -> Start Diagnostic Tools Without Debugging
    注意:这似乎已经更改为 Debug -> Profiler -> Performance Profiler...
  3. 勾选 Application Timeline 工具并在此视图中点击 Start

Tool settings

  1. 当您的应用程序启动时,请执行导致您感兴趣的问题的操作。
  2. 然后点击 Stop recording,您最终将获得每个节点呈现所花费时间的元素树。接下来,您只需要按Duration (total)排序并展开最慢的节点,直到找到问题所在:

Result

最后,如果您使用 Name 属性为控件设置名称,则可以更轻松地将上述树中的节点与布局相关联,如下所示:

<TextBlock Name="OwnerContact">

1
事实证明,Visual Studio 的后续版本已经内置了此功能,所以现在使用 Visual Studio 2013,我可以通过打开 Visual Studio,并从顶部菜单中选择“分析”下拉菜单,然后进入“分析” -> “分析器” -> “附加/分离”来创建一个新的分析器会话并将其附加到正在以调试模式运行的现有进程上(我似乎必须在另一个 Visual Studio 窗口中执行此操作,否则它会变灰)。但是,需要注意的是:它真的很差,不太直观...我建议使用一些更好的商业分析器,因为它们更简单。

如果您能推荐一个带有WPF元素树分析功能的商业分析器,我将非常乐意尝试。我已经尝试过ANTS,但它似乎没有提供这样的洞察力。 - Alexander Abakumov
@AlexanderAbakumov 你尝试过使用试错法来确定哪个UI元素导致了最长的延迟时间吗?所以...这只是一个想法,也许你可以注释掉某些UI元素,并尝试通过这种方式确定最热门的元素?另外一件事情是,在你的代码中使用计时器来查看哪个代码部分需要最长时间来运行。 - Alexandru
@AlexanderAbakumov 我知道你想知道哪个元素出了问题,但最好是沿着调用堆栈向上查看,看看哪些代码会对用户界面进行操作以使其花费延迟时间,并从那里开始倒退,因为几乎总是问题不在WPF上,而是在调用其控件的代码上 :P - Alexandru
1
Alexandru:是的 :) 我最终安装了VS 2015,并使用其新的内置分析工具Application Timeline。除其他事项外,它正好做我所寻找的:它显示元素树和布局过程中每个级别花费的时间。这对于快速定位主要问题、尝试不同解决方案并分析它们的实际表现非常有帮助。 - Alexander Abakumov
1
Alexandru:我已经发布了 - 请查看下面的答案 :) 请随意点赞或让我知道我可以做些什么来改进它。 - Alexander Abakumov
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接