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

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

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

收集数据

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

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

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

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

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

简要概述了 CPU 采样

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

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

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

分析报告

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

摘要页

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

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

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

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

函数详细信息

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

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

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

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

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

调用堆栈视图

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

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

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

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

结语

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

使用CPU探查器优化XAML程序的更多相关文章

  1. SQL Server 2008 事件探查器(SQL SERVER Profiler)

    要想很好地优化ERP系统,可以从客户端.服务器.网络等入手,对于我们M1系统的优化来说,SQL 语句的优化就起到很重要的作用了.为此,我们展开,学习了SQL SERVER 2008的事件探查器(SQL ...

  2. 【转】SQL Server 2008 事件探查器(SQL SERVER Profiler)

    跟踪数据库sql语句的执行情况.例:一个系统,用到了sql server 数据库,这个系统共有500张表,当用户在前台页面做某一个操作时,比如插入,登录等等,我们想知道此刻是在对哪一张表操作,打开事件 ...

  3. 江湖恩仇录之PHP程序CPU高占用优化经历分享

    故事起因 本故事根据真实故事书写,如有雷同绝非巧合.在开发过程中难免反复修改程序,面对突然起来的问题难免束手无策,有些人选择自我处理问题,也有人选择交流区域咨询,或许恰巧有人有类似的问题,刚好可以解决 ...

  4. Unity Shader着色器优化

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...

  5. 10个技巧优化PHP程序Laravel 5框架

    10个技巧优化PHP程序Laravel 5框架 性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践www.itxdl.c ...

  6. 一步步做程序优化-讲一个用于OpenACC优化的程序(转载)

    一步步做程序优化[1]讲一个用于OpenACC优化的程序 分析下A,B,C为三个矩阵,A为m*n维,B为n*k维,C为m*k维,用A和B来计算C,计算方法是:C = alpha*A*B + beta* ...

  7. flask-profiler, 监视端点调用并尝试进行某些分析的Flask 事件探查器

    源代码名称:flask-profiler 源代码网址:http://www.github.com/muatik/flask-profiler flask-profiler源代码文档 flask-pro ...

  8. 利用VS 性能探查器 解决代码性能不高问题

    VS2017 分析-性能探查器 选择你想分析的项目,选择你的分析工具,我这边是遇到了一个cpu爆满的问题 启动后需要点击一下记录cpu,否则会没有后续的分析忘了截图了,下面是出的分析报告,分析时间比较 ...

  9. 怎么优化JAVA程序的执行效率和性能?

    现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...

随机推荐

  1. (转载)c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程

    c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程 可能大多数程序员会问:透明窗口,特别是透明Panel有什么应用价值呢?可别小看它们哦,下面我就来讲讲他们的巨大 ...

  2. 一个令人困惑的低效SQL

    整理之前的优化案例,觉得下面这个应该是开发很难发现也会很困惑的一个低效SQL. 看下面这个SQL.你看到这个SQL会不会感觉很正常.其实我刚看到也觉得正常得不得了.但是测试后它确实效率很低.selec ...

  3. IOS 获得通讯录中联系人的所有属性 备用参考

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  4. [JavaScript] 初中级Javascript程序员必修学习目录

    很多人总感觉javascript无法入门,笔者在这里写一下自己的学习过程,以及个人认 为的最佳看书过程,只要各位能按照本人所说步骤走下去,不用很长时间,坚持 个3个月,你的js层级会提高一个档次,无他 ...

  5. Oracle数据库的下载和安装

    那天分享一下Oracle的下载和安装的过程,有需要的朋友可以借鉴参考一下.如有雷同不胜感激! 首先可以到Oracle的官网下载Oracle的最次年版本的Oracle数据库.一下是个人下载的数据库版本百 ...

  6. codeforces 391C3 - The Tournament

    在第8组数据上WA了一天,后来才发现问题: #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  7. 【重要版本】Firefly alpha beta v1.2.2 正式发布

    原地址:http://bbs.gameres.com/thread_220175.html firefly 1.2.2 更新 更新内容: 功能添加       1.动态模块更新       2.部分b ...

  8. CDC 虚拟com口

    现在很多电脑已经不带232了,特别是手提电脑.这使很多使用手提在外调试人员非常不方便.或许你可以买一条市面上usb转232转换线,但这些线抗干扰不是太好,在一些干扰大的地方会发生连接中断的问题,所以往 ...

  9. QML嵌入到QWidget中方法

    简介 嵌入方法有两种一种是直接拖控件,另一种是cpp代码动态生成, 控件方式 动态代码生成 QQuickWidget *m_quickWidget=new QQuickWidget(); QUrl s ...

  10. WPF中的MatrixTransform

    原文:WPF中的MatrixTransform WPF中的MatrixTransform                                                         ...