使用CPU探查器优化XAML程序

 

如果您正在开发一个使用 XAML (是否是 c + +、 C# 或 VB) 的 Windows 商店应用程序,还有一个好的机会来提高应用程序的性能。为了帮助完成这一点,我们所有在售的能够应用开发 Windows 商店应用程序Visual Studio 都包含了CPU 探查器程序(这意味着我们已经将原本 visual stduio的一个额外属性 包含在 Visual Studio的高级功能的移动CPU剖析 两个版本中)。在这篇文章,我会教会您如何使用CPU 事件探查器剖析您执行最频繁的代码来提高性能。

这篇文章,我会分析一个叫BubblePopper的简单游戏,它是用 C# 和 XAML 开发的。这个游戏有左右漂移的气泡,它们可以飘向屏幕的顶部,单击或按下上他们会导致他们的泡沫爆裂。

clip_image002

不幸的是,每当一个泡沫改变方向我注意到它似乎暂停了短暂的时间,导致很不好的体验。所以我要去探查器用于分析这种行为。

收集数据

BubblePopper的解决方案一旦在 Visual Studio 中打开,我使用"调试-> 启动性能分析"来启动探查器。

clip_image004

这将构建和部署我的应用程序,然后启动附加探查器。如果第一次使用探查器, Visual Studio会弹出 vsperf.exe 的提示

一旦我的应用程序启动和运行,在 Visual Studio 中,我看到的让我知道数据收集正在进行的"进步分析"页。从这里我可以暂停数据收集以及停止分析。

clip_image006

在气泡活动的时间段,我想提高应用程序的性能。对于泡沫波普尔的应用程序只是玩游戏大约一分钟,让泡沫上浮时点击一下戳破它们。

大约一分钟,我有信心我收集了足够的数据来得到我的应用程序性能的一个准确的描述后,所以我返回到 Visual Studio,并单击"停止收集"。

简要概述了 CPU 采样

下一步,理解CPU采样是如何工作的是这项工作的关键。在分析问题之前,我会简略解释 CPU 采样之的原理。CPU采样收集调用堆栈每毫秒进行一次,针对CPU每个核心。

一旦停止收集数据,会生成数据摘要。报告之后,才会显示哪些方法在调用堆栈最频繁 (非独占样本数)。这意味收集的数据时间越长,得到的分析结果越准确。

需要注意的, (JMC)这个属性。如果勾选了JMC (just my code ),分析器收集到数据样本只会与指定的代码相关。这是一个有用的特性,这就是为什么我们有默认打开它。

clip_image008

clip_image010

分析报告

在单击停止分析之后,将停止数据收集、 目标应用程序将被终止,对报告的分析将开始。在此过程中,探查器将尝试使用您的Visual Studio 符号设置加载符号

clip_image012

摘要页

分析完成后您将看到的第一页是摘要页。摘要页包含三个主要领域的信息:

  1. CPU 图表: 显示您的应用程序随着时间的推移相关的CPU 的使用率。
  2. 热路径: 这是您的应用程序花费时间最长的调用路径 (基于非独占样本数)
  3. 耗时最多的函数: 大多数 CPU 时间花在 (基于独占样本)这些函数调用上

clip_image014

在这里我想指出 CPU 事件探查器要帮我改善我的应用程序的性能,即使我的应用程序不使用高百分比的CPU。这是因为即使应用程序的问题不出在 CPU占用上 ,也可以通过热路径来分析最可能产生的问题。

关于符号的快速说明。如果你注意到在 [mscorlib.ni.dll] 上面截图出现的函数做最多的工作。当模块名称将显示在方括号中它意味着为此模块未被加载符号。当模块名称中有".ni"时,这表示它是一个 NGENd 的托管的模块。有关 NGENd 模块的符号的说明请参阅创建 NGEN Pdb 的分析报告.

函数详细信息

当我点击摘要页中的函数名称 (如上面我做),就会打开该函数的函数的详细信息视图。顶部显示我在中捕获的样品的百分比:

  • 调用当前函数的函数 (如果有) 的比例
  • 当前函数,直接调用的百分比
  • 当前函数所有调用的函数之间的样本分布

clip_image016

图表展示了我的应用程序支出 ~27.5%的时间花在完成创建新的每一个气泡。要改善这种情况,我要去尝试:

  • 重新使用现有的演示图板,刚刚结束只需要更新的 x 和 y DoubleAnimation 属性
  • 将 DoubleAnimation 对象存储为泡沫类中的属性,所以他们不需要从 TimelineCollection 中检索
  • 存储目标 x 和 y 坐标,在泡沫中的属性类,所以他们不需要从 DoubleAnimation 对象中检索

这会导致下面的 moveBubble_Completed 实现(已经离开了原来的大多数代码注释掉,以帮助突出显示所做的更改)。

clip_image018

调用堆栈视图

现在,我认为改善了。但我还要查看其他可疑的地方。

clip_image020

看看该调用关系树,只有其他调用路径似乎有相当数量的样品耗时花在 nvwgf2um.dll 。

clip_image022

这不是我的应用程序的一部分,但.dll 文件快速搜索告诉我它是我的显示驱动程序,这个没有太多的优化可以做了。

启动该应用程序显示气泡改变方向得更加顺畅,所以它看起来像已经实现了我的目标,改进了我的应用程序中的性能。

结语

虽然这是一个简单的关于 Windows 应用商店应用程序的例子,希望它可以帮助你了解如何使用 CPU 事件探查器来提高应用程序中的性能。

 


你可能感兴趣的:(cpu)