写点什么

应用性能:规划成本远小于重构

  • 2013-07-05
  • 本文字数:1618 字

    阅读完需:约 5 分钟

开发人员常说,他们的目标之一是使应用程序“快”。然而,当他们发布应用时,客户还是抱怨速度太慢并且反应迟钝。根据微软内部的研究结果,这种问题最常见的根源是缺乏对性能的规划。让应用程序运行得“快”,是个不切实际的目标,因为它无法测量。因此,当应用性能开始下滑时,开发人员往往注意不到。如果性能测试是在特定的硬件或环境条件下进行的,那么会更糟。

快速、流畅、高效能是性能的支柱。但与其看着这些抽象的概念,不如讨论如何能够让现实的计划拥有具体的目标,如“在主视图中加载 30 张图片的时间应当小于 1 秒”。这类性能规划考虑到了有目的的测试和对性能问题的早期发现。

快速

确定应用程序是否“快”的一种方法,是依据“交互分类(Interaction Classes)”对它进行观察。交互分类是用于描述交互类型及其可接受的交互完成时间。下面是微软在项目中使用的一些样例:

  • 快速(Fast):100 至 200 毫秒——比如​​点击按钮、打开菜单、打开应用栏(App Bar)等;
  • 典型(Typical):300 至 500 毫秒——调整大小、语义式缩放(Semantic Zoom)等;
  • 响应(Responsive):500 毫秒到 1 秒——导航到其它页面;
  • 启动(Launch):1 到 3 秒——冷启动;
  • 持续(Continuous):500 毫秒到 5 秒——下载文件;
  • 受控(Captive):500 毫秒到 10 秒——运行更长时间的操作。等待时,用户可能会切换到另一个应用。

复杂的交互过程可能需要分解成为多个时间点。比如,导航到搜索结果页,可以分解为三个时间点:

  1. 首次应答(快速):用户已经看到开始搜索了,所以他们不用持续的点击搜索按钮;
  2. 响应:用户已经可以看到搜索结果的文本信息,并且可以使用 UI;
  3. 完整的展现(持续):继续加载所有内容,包括图片。

流畅

流畅性可以通过帧每秒(fps)的单位测量。对于大多数应用程序,建议目标是被称为“平滑流畅(Buttery Smooth)”的标准,每秒 60 帧。如果应用程序不能保持这个水平的流畅性,那么应当考虑简化显示内容。

高效能

开发人员考虑高效能时应当从用户的角度出发。当用户运行应用程序进行某些工作时,他们通常不会在意 CPU 或网络是不是正在发热。但当用户空闲的时候,应用程序也应当处于闲置状态。因此,所有应用程序的目标是环境资源的零消耗。

如果应用程序会消耗更多的内存,就更容易被钝化(Swapped Out)到磁盘或是被逻辑删除(Tombstoned),所以另一个目标应该是降低内存占用。因为根据应用程序的类型不同,内存占用方面的差异很大,所以在这里无法给出具体的建议。

最终用户会非常关注电池的寿命,而对于移动设备来说,流量使用情况也是用户关注的一个方面。根据微软曾委托进行的一项研究来看,50%的用户将耗电量大作为他们卸载应用程序的原因。幸运的是,通过现代化的性能工具,不仅能测量 I/O 传输,还能够估算应用程序运行所消耗的电量。流量的问题也是如此。

检测

为了完全了解应用程序的性能行为,我们必须规划并嵌入大量的检测内容。读者可以考虑使用更高级的日志框架,比如语义日志记录(Semantic Logging),通过它可以对特定操作的开始和结束进行关联。

测试

空闲的(Quiet,译者注:原意为安静,是相对于测试结果中的干扰而言)系统对测试来说是关键,如果系统后台进行着任何工作,那么可能会直接影响测试结果。为避免这些问题,微软的 Will Sergeant 建议各位读者:

  • 关闭后台应用程序。如果读者使用的是 Windows 8,那么要关闭“锁屏应用”。
  • 对于托管代码,生成本机代码映像(Native Code Image)。也可以这么解决:运行该应用程序 30 秒以上,然后运行 Windows 8 的系统维护任务。
  • 总是运行多个进程,并捕捉这些进程的信息。

硬件

要对在各种硬件和网络拓扑进行测试。因为较慢的网络会对应用程序性能的表现产生灾难性的影响,特别是当它在 UI 线程上试图下载数据的时候。另外,屏幕尺寸也会对性能有显着的影响,因为大屏幕需要同时显示更多的数据。

本文内容出自微软Build 2013 开发者大会上的同名演讲

查看英文原文: Performance: Planning Costs Less than Rearchitecting

2013-07-05 06:071943
用户头像

发布了 36 篇内容, 共 13.9 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

docker的网络管理

爱好编程进阶

程序员 后端开发

Elasticsearch中的Term查询和全文查询

爱好编程进阶

Java 程序员 后端开发

Activiti6

爱好编程进阶

Java 程序员 后端开发

ElasticSearch中DSL高级检索(Query)

爱好编程进阶

Java 程序员 后端开发

Nacos在企业生产中如何使用集群环境?

牧小农

nacos SpringCloud Alibaba

阿里架构师花两个月时间整理出来的Java独家面试题(Java岗)

Java架构追梦

Java 程序员 后端开发

20多年的岁月里一路走来满是辜负与遗憾,从双非到阿里SP,收到offer的那天我哭惨了

爱好编程进阶

Java 程序员 后端开发

3 面蚂蚁,一路过关斩将 成功拿到 offer 定级 P6,大厂面试雀食有点难

爱好编程进阶

Java 程序员 后端开发

Apache负载均衡与Tomcat集群配置学习(Windows环境)

爱好编程进阶

Java 程序员 后端开发

Drools规则引擎实践直白总结

爱好编程进阶

Java 程序员 后端开发

3分钟带你彻底搞懂 Kafka

爱好编程进阶

程序员 后端开发

5 年 Java 经验,字节、美团

爱好编程进阶

Java 程序员 后端开发

Centos7安装JDK和Tomcat详细步骤

爱好编程进阶

Java 程序员 后端开发

dubbo 长连接

爱好编程进阶

Java 程序员 后端开发

头一次见这么牛的的SpringBoot从入门到实战文档

Java架构追梦

spring java面试 后端开发

面试了200多个程序员,多数上来就要20K,说实话6K我都不想给

Java架构追梦

Java 后端开发 程序员面试

9000字通俗易懂的讲解下Java注解,你还看不明白?

爱好编程进阶

Java 程序员 后端开发

elasticsearch各种问题总结

爱好编程进阶

Java 程序员 后端开发

千万级学生管理系统的考试试卷存储方案

凯博无线

GitHub已置顶!Alibaba最终版Java面试小抄+架构师系统进阶指南

Java架构追梦

Java 后端开发 程序员面试

公司8java开发接私活被抓了,我说他最近咋这么飘

Java架构追梦

程序员 JAVA开发 java面试 后端开发

Dockerfile 搭建tomcat基础镜像与项目镜像

爱好编程进阶

Java 程序员 后端开发

Elasticsearch Query DSL之Compound queries(复合查询)

爱好编程进阶

Java 程序员 后端开发

五分钟搞懂分布式流控算法

俞凡

架构 算法

不要再焦虑了,进大厂真的没你想象的那么困难

Java架构追梦

9 个 Java 性能调优技巧,YYDS!

爱好编程进阶

Java 程序员 后端开发

@Autowire和@Resource注解使用的正确姿势

爱好编程进阶

Java 程序员 后端开发

Day163

爱好编程进阶

Java 程序员 后端开发

Day232&233

爱好编程进阶

Java 程序员 后端开发

成为Java顶尖程序员之前,先过了下面问题才行

Java架构追梦

Java 后端开发 数据结构与算法

自己动手写 Docker 系列文章总览

Go Docker 4月月更

应用性能:规划成本远小于重构_架构_Jonathan Allen_InfoQ精选文章