注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

MSDN Blog:如何提高 Metro 风格应用程序的性能  

2012-05-17 14:54:16|  分类: Windows 8 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

速度慢或无响应的应用程序无法得到用户的青睐。用户希望应用程序能够立即响应触摸、点击、单击、手势和键击。用户还希望动画能够很流畅,他们能够快速地播放、暂停和重新开始他们的音乐和视频,并且他们永远不必等待应用程序赶上他们的节奏。本文是介绍如何使您的应用程序“快速且流畅”的系列博文中的开篇之作。

我们的工程团队投入了大量时间来思考如何才能确保 Metro 风格应用程序的性能。我们已了解到我们可以在平台中做些工作来交付快速、流畅的性能;同时我们还了解到在构建能够提供出色体验的应用程序时哪些工作起作用,哪些工作不起作用。在本博文中,我将与您分享一些我从自己的经验中吸取的沉痛教训,以便您可以为客户构建尽可能最佳的体验。

性能心理学

性能不仅仅是一个秒表和高效算法。当我想到性能时,我喜欢用全局的眼光来看,并考虑用户在使用应用程序时对时间的感觉。快速且流畅对应用程序意味着什么?思考这一问题的其中一种方法是将用户的体验分为三个类别:感知、容忍度和响应速度。

感知:这未免也太久了吧!

感知决定着快速且流畅中的“快速”。我们将用户对性能的感知定义为用户在多大程度上愿意回忆在您的应用程序中执行他们的任务所花的时间。在理想情况下,用户的感知应该与现实相符。但通常并非如此,他们对时间的感知比现实更重要。您是否遇到过这种情况:您让某个安装过程自行完成,等您回来时却发现它半道上暂停了,正等待您回答另一个问题?

对于某个过程,您能记住的步骤越多,它看起来就越慢。

建议做法:
  • 缩短用户为了完成任务需要执行的活动之间间隔的时间。
  • 确保每次您需要询问用户问题或者让他们提供信息时,您都提前提出所有问题。
应避免的做法:
  • 将用户活动分散到多个时段内,每个时段都间隔一定的时间。

容忍度:欢乐时光总是过的特别快

容忍度对快速且流畅中的快速和流畅都有影响。如果说感知衡量的是用户能够回忆起过去的时间量,那么容忍度衡量的是用户对过去的时间的满意程度。

当用户不知道某项操作需要多长时间时,等待是痛苦的。设想一下,您正在使用某个应用程序进行一些照片编辑工作。当您通过单击应用筛选器时,应用程序变得没有响应。冻结的这段时间很快就变得难以忍受,即使只是几秒钟而已。

照片应用程序通过添加一个进度条或小型动画来指示它正在应用筛选器,从而解决了这一问题。因为消除了不确定性,用户愿意等待工作完成的时间量就大大增加。该应用程序不仅快速而且流畅,差异是巨大的。

建议做法:

  • 花一点时间找出您的应用程序中可能需要较长加载时间(>= 1 秒)的区域。
  • 采取一些步骤来限制或消除这些方案中的用户不确定性。
  • 通过直观的指示告诉用户他们处在过程中的哪个阶段以及该过程将需要多长时间完成。
  • 使用异步 API 以避免阻止 UI 线程并导致应用程序看起来已冻结。

应避免的做法:

  • 执行长时间运行的操作而不向用户提供反馈。

响应速度:反射 < 反映 < 确认

响应能力决定着快速且流畅中的“流畅”。如果容忍度衡量的是对时间的预期和满意程度,那么响应速度这一概念是指时间预期是相对于所执行的活动而言的。要衡量和评价活动的性能,必须存在可比较的时间间隔。我将这些时间间隔称为“交互类”。在内部,我们使用这些交互类来定义整个 Windows 中的核心方案的响应速度目标,并将未能满足这些目标的情况作为产品缺陷进行跟踪。

交互类  目标  上限  人的感知  典型方案
即时 <= 50 毫秒 100 毫秒 没有明显延迟。 输入响应 - 单击鼠标、点击按钮等
很快 50 – 100 毫秒 200 毫秒 延迟几乎不可察觉。不需要反馈。 平移/滚动
典型 100 – 300 毫秒 500 毫秒 较快,但算不上很快。不需要反馈。 打开页内对话框(即信息提示、弹出窗口、飞出控件、Toast 等)
有响应 300 – 500 毫秒 1 秒  不是很快,但仍然感觉到响应。不需要反馈。 导航到新页面、缩放、显示已处理或已就绪数据
持续 >500 毫秒 10 秒 中等长度等待时间,不再感觉有响应。时间没有长到可以做其他事情。可能需要反馈。 启动应用程序、贴靠应用程序、错误消息、超时、更新进度指示
长时间 >5 秒 >1 分钟 等待时间足够长,可以做其他事件。可能需要反馈。 对设备/库进行同步或编制索引

建议做法:

  • 将应用程序的重要方案分配给代表所需体验的交互类。
  • 找出您的方未能满足这些目标的情况并进行优化。
  • 确定某方案是否需要用户反馈并相应地提供反馈。

需要优化的重要体验

性能问题会通过各种方式显现出来。它们可能会缩短电池使用寿命、导致平移和滚动滞后于用户的手指,甚至使应用程序看起来长时间冻结。我知道您没有太多时间来改善性能,因此这一节将介绍一些有关如何确定优化后将产生最大影响的区域的一些提示,以及一些可帮助您进行这些优化的指南。

考虑进行优化的一种方法是,某个过程所用的时间需要缩短或增加 20% 用户才能感觉到差异。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~ 

您可能发现应用程序中很容易实现的目标可以大大提高关键方案的性能。但是当您修复这些问题时,就会变得越来越不可能无意中就能发现可立即将过程持续时间缩短 20% 的单个性能问题。它往往是同一路径中对同一用户体验问题均产生影响的较小问题的积累,在下一节中,我将讨论一个用于发现这些路径的出色工具。

应用程序分析

确定优化能产生最大影响的区域的其中一个最简单也是可最快投入使用的方法是执行应用程序分析。分析可提供有关您的应用程序在其各种函数中所花时间的数据,以便您可以看到应用程序执行其大部分工作的热点区域。令人欣慰的是,Visual Studio 11 中提供了一个出色的分析工具,您可以在 Windows 8 Consumer Preview 中进行访问。

不过在开始之前,请记住,Windows 8 将在各种各样的设备上运行,对功能强大的硬件执行性能测量可能无法真正地显示其他尺寸的设备上的性能特征。对于我自己的许多功能而言,在执行测量时,我使用的是低端便携式计算机。有关详细信息,请参阅博文运行 Consumer Preview:系统推荐

下面介绍了如何准备计算机以进行测量:

  1. 确保计算机已插上电源而不是使用电池运行 – 许多系统在使用电池时会以不同方式运行以节省电能。
  2. 不要使用远程桌面执行测量,因为它可能会禁用硬件加速并使结果出现偏差。
  3. 确保系统上的总内存使用率低于 50%。如果高于该值,请关闭一些应用程序,直到降至 50%,以确保测量的是您的应用程序的真正影响,而不是其他进程的影响。

开始分析您的应用程序:

  1. 在 Visual Studio 中启动您的应用程序。
  2. 在 [Debug](调试)菜单中,选择以下两个性能分析选项之一:
  3. MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~ 

    • [Start Performance Analysis](启动性能分析):立即开始记录使用情况信息并启动应用程序。
    • [Start Performance Analysis Paused](启动暂停的性能分析):启动应用程序,稍后您可以继续记录信息。这用于在开始记录信息之前使应用程序进入某特定状态(例如,为了测试特定用户方案)。
  4. 执行要测量的操作后,返回 Visual Studio 并单击 [Stop profiling](停止分析)。这将促使 VS 生成一个报告并显示有关应用程序活动的重要信息。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~

性能报告中两个最有用的视图是“调用树”视图和“函数详细信息”视图。在“调用树”视图中,您可以看到您的应用程序在执行过程中调用的所有函数、它们被调用的次数以及它们执行时所花的时间。还有一个“展开热路径”按钮,该按钮可显示哪些函数的执行时间最长。这些函数是您需要首先重点优化的区域,因为它们产生的影响可能最大。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~

 报告显示每个函数的非独占时间和独占时间。独占时间测量执行该函数中的代码所用时间的百分比。非独占时间是指从调用该函数到该函数返回结果之间的这段时间所占百分比。换句话说就是,它不仅包含执行该函数中的代码所用的时间,还包含执行它所调用的任何函数中的代码所用的时间。

对于您应用程序中的任何函数,您都可以打开“函数详细信息”视图,以获取有关该函数已完成的操作的详细信息,包括它执行的特定代码、它调用哪些函数以及这些函数用了多长时间。在下图所示的示例中,Array.concat 函数是热路径的重要促进因素,占用了应用程序执行时间的 29.7%。“函数详细信息”视图向我们显示了,Array.concat 函数本身实际上只占用大约 12.6% 的时间(用橙色显示),大部分时间实际上是由串联函数在执行时调用的 get_MainResourceMap 函数占用的(用紫色显示)。然后您可以单击其中任一函数以获取更多详细信息。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~

 在 Windows 8 Consumer Preview 发布前的几周,我曾使用其中一个应用程序并注意到我的便携式计算机逐渐发烫,风扇也开始运转。在与应用程序所有者合作的过程中,我们使用了分析功能来找出导致不必要的大量 CPU 使用率的某些代码,随后对其进行了修复。差别立即显现出来,并且其他应用程序方案(例如贴靠)也通过这些更改有所改善。

挂起是您的朋友

仅当您的应用程序没有挂起时才会启动应用程序 – 否则,在恢复时,您的应用程序几乎会立即重新显示。保持应用程序的挂起状态是管理感知、容忍度和响应速度的一种方法。用户希望您的应用程序更迅速,并且希望每次使用应用程序时都不会遇到不确定的加载等待时间。简而言之,避免您的应用程序被终止是提高性能的一大成功。实现此目的最简单的方法是保持应用程序在挂起时使用较少的内存。

在您的应用程序挂起之前,有几秒钟时间可以做些工作。在这段时间内,释放在恢复时可以轻松重新获取的任何大对象。这会使您的应用程序只占用较少内存,并大大降低系统终止您的应用程序以便为其他程序腾出空间的可能性。下面介绍了如何判断您的应用程序是否正确挂起:

  1. 启动应用程序,然后返回桌面。
  2. 按 Ctrl+Shift+Esc 启动任务管理器,然后单击 [More details](更多详细信息)以查看所有可用选项。
  3. 单击 (视图)> [Status values](状态值)> [Show suspended status](显示已挂起状态)。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~

几秒钟后,您应用程序名称的旁边将会出现 [Suspended](已挂起)一词。确保您的应用程序在挂起时的专用工作集内存使用量远远低于运行时的内存使用量。建议您基于应用程序的复杂性和常规大小,设定挂起时的这些内存指标的目标:

 应用程序复杂性(近似)  暂停时的专用工作集(最大)
 极小应用程序(如 Hello World)  40-60 MB
 中等应用程序(如天气)  60-80 MB
 大应用程序(如 Windows Live 照片)  120-150 MB

下面介绍了如何查看应用程序在挂起时的内存使用量:

  1. 确保使用前面介绍的步骤挂起应用程序。
  2. 在任务管理器中右键单击应用程序的名称,然后单击 [Go to details](转到详细信息)。这会显示有关应用程序进程的更多信息(WWAHost.exe 是所有使用 JavaScript 的 Metro 风格应用程序的进程;否则您应用程序的名称将显示为该进程)。
  3. 确保存在 [Memory (private working set)](内存(专用工作集))列。如果不存在,请右键单击任意列,转到 [Select column](选择列),然后选择 [Memory (private working set)](内存(专用工作集))
  4. MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~ 

  5. 该列下列出的值是您的应用程序的专用工作集。

MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~ 

成为应用程序生态系统中的一位好公民

听起来可能很让人失望,但您的应用程序不是唯一会被使用的应用程序。因此,在用户系统上运行时应表现得像一位好公民,以便用户不会开始将系统中察觉到的任何延迟归咎于您的应用程序,并开始在内心将它与系统上较差的性能或电池寿命联系起来。下面是帮助您的应用程序与其他应用程序打成一片的几个提示。

不要使内存使用率达到高峰

系统的工作是满足所有 Metro 风格应用程序的资源需要,方法是自动终止挂起的应用程序以便为应用程序腾出空间,从而将用户从管理资源的负担中解放出来。这么做的一个副作用是,如果某应用程序请求大量内存,那么其他应用程序可能会被终止,即使该应用程序在请求后很快就释放那些内存也是如此。为了避免在处理繁重操作时出现这一问题,最好是将内存分成小块。

如果您使用通过内存管理的语言(如 JavaScript 或 C#)编写代码,则极难控制内存分配时间。但是,很容易掉进去的一个陷阱就是加载资源,对于当前系统的解决能力而言,这些资源过于庞大,无法将其缩小。您可以使用新的缩略图 API 来获取适合目标解决方法的资源,并避免造成不必要的高开销。我们使用此方法大大减少了我们用于测试的基于图片的智力游戏的内存使用量。

无论采用哪种语言,我都建议您基于应用程序的复杂性和常规大小设定这些运行时内存指标的目标:

 应用程序复杂性(近似)  总工作集(最大)
 极小应用程序(如 Hello World)  50-70 MB
 中等应用程序(如天气)  80-100 MB
 大应用程序(如照片)  120-150 MB

下面是查看应用程序运行时所用内存量的方法:

  1. 按 Ctrl+Shift+Esc 启动任务管理器,然后单击 [More details](更多详细信息)查看所有可用选项。
  2. 单击 [Options](选项)菜单项,并确保选中 [Always on top](前端显示)。
  3. 启动您的应用程序。当应用程序出现在任务管理器中时,右键单击它,然后单击 [Go to details](转到详细信息)。
  4. 确保存在 [Working set (memory)](工作集(内存))列。如果不存在,请右键单击任意列,然后转到 [Select columns](选择列)。选中 [Working set (memory)](工作集(内存))列。

    MSDN Blog:如何提高 Metro 风格应用程序的性能 - 乂乂 - 一个人,一支烟  ·~~ 

  5. 该列下面列出的值是您的应用程序的总工作集。

在闲置或贴靠状态时,尽可能减少系统资源的使用

用户最关注的问题之一就是其设备的电池使用寿命。因此,建议您的 Metro 风格应用程序通过在用户没有与其交互时释放它们使用的系统资源来帮助节约能源。下面是降低资源使用率的几个提示:

不要运行已贴靠的动画、音频或背景视频。

  • 您的应用程序不再是注意力的中心。让您的应用程序看起来丰富多彩并且可用,但不要减少主应用程序可用的资源,也不要使用电池。
  • 这假定您的应用程序不是专用的音乐/视频播放客户端。

不要以无限循环方式运行动画、音频或背景视频

  • 如果用户在一小段时间内没有与应用程序交互,请暂停这些活动。下次与应用程序交互时,可以放心地恢复这些活动。
  • 我已经看到仅仅是因为应用程序暂停了其后台活动,其闲置时的 CPU 使用率就从 40% 降低至 0%。

在贴靠或闲置状态时,不要执行文件缓存、设备同步或任何其他磁盘密集型操作。

  • 使用磁盘会不必要地增加其他操作的搜寻时间并消耗大量电能。

展望未来

在本博文中,我介绍了您可以如何思考性能,为应用程序中的关键体验设置目标的方法,还介绍了一些帮助找出可能需要优化的领域的工具。我的下一篇博文将介绍如何针对最大的问题领域进行这些优化以及如何避免某些常见缺陷。希望这些提示对您有所帮助!

下次再见,

-- Windows 项目经理 David Tepper

【from http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/10/metro.aspx
【本文链接 
http://zwkufo.blog.163.com/blog/static/2588251201241725416475/

  评论这张
 
阅读(972)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017