性能优化开篇综述
为什么要做性能优化
首先引用一下 High performance iOS Apps 这本书中的一段统计数据:
Consider the following statistics:
- 79% of users retry an app only once or twice if it failed to work the first time.
- 25% of users abandon an app if it does not load in 3 seconds.
- 31% of users will tell others about their bad experience
翻译过来的意思就是:
-
应用首次出错后,79%的用户只会再重试一两次
-
当应用启动时间超过3秒时,25%的用户会放弃使用该应用
-
31%的用户会将糟糕的体验告知他人
从上面的数据统计可以看出,App性能对于应用的重要性,App能否被用户所认可不仅仅取决于其功能,还取决于当与用户交互时,应用能否提供流畅的体验。
从某一个角度来看,是因为你的APP是可替代的,我们可以从App Store找到大量的功能相似的替代品,为什么用户在功能相同的情况下会坚持使用你开发的这一款,两个原因:你的APP在功能上无可替代,或者是极少故障且性能格外出众
App性能会受很多因素影响,这些因素包括内存消耗,网络请求效率,用户界面的流畅性,用户操作的响应速度。所以我们对性能的描述有一个量化的过程,我们需要先概述不同类型的性能特征,然后再对它们进行测量。
性能的衡量标准是什么
从用户使用的角度来说
一个好的移动应用应该要具备以下三个特点
-
可用性
-
高性能
-
稳定性
可用性衡量用户如何与你的移动应用程序交互。如果他们无法操作你的应用程序,如很多功能无法使用,点击界面无响应,滑动页面时卡顿乃至奔溃,这些情况,用户很大可能会将你的APP从移动设别上删除。
高性能,这个其实是用户感知最深的一块,这里包括几个小的方面,如用户界面响应效率,网络请求效率,用户交互体验。
-
用户界面响应效率:根据 Dimensional Research 的调查,49%的用户希望应用程序在2秒或更短的时间内做出响应,因此检查应用程序的启动和UI性能对于应用程序的成功至关重要。模拟不同类型的环境,以确认应用程序快速,顺利地响应用户的命令。
-
网络请求效率:如果应用程序在理想的网络模拟中表现良好,那是非常棒的,但你的应用程序也需要在不太理想的环境中运行,在低带宽,延迟高的不可靠网络环境下,也需要有一套机制来保证数据的快速展示,这里可以使用缓存,也可以并发请求提供提高响应效率。
-
用户交互体验:如果用户在滑动列表时感觉到卡顿,点击按钮时无响应,打开某个页面速度很慢,就会被用户打上
Low performance
的标签,从而寻找同类型同功能体验更佳的APP,这个其实是性能优化的核心。
稳定性意味着它具有流畅,不间断的体验,不会出现错误消息或用户崩溃。如果应用程序一直收到错误消息的弹窗提示或者永无止境的加载屏幕,如果用户打开应用程序之前一直奔溃,如果用户使用应用程序几个小时之后发现电池是红色的,绝大部分用户会停止使用该应用程序。
从技术的角度来说
我们可以把性能量化成一个个可测量的性能指标,下面我将描述我对于性能量化的一些评判标准:
1. 内存
应用程序内存峰值取决与系统的硬件配置,占用过高的内存会导致后台应用被强制关闭,同时还要确保没有内存泄漏,随时间流逝持续增长的内存消耗意味着,应用程序可能会因为内存不足的异常而奔溃
2. 电量消耗
电量消耗过大一般情况下会伴随着设备发烫,电量消耗是一个涉及面很广的场景,它不仅仅与计算CPU周期有关,还包括高效地使用硬件。除了要实现电量消耗最小化,还要确保不会影响用户体验。
3. 初始化时间
应用在启动时应执行刚好够用的任务以完成初始化,从而满足用户的使用需求。执行这些任务消耗的时间就是应用的初始化时间。启动时间会直接影响用户对应用程序的感官,秒开的APP一般意义上来说都是用户喜欢的。
4. 执行速度
当触发了某个操作,用户总是希望它可以尽快地工作。一切必要的处理都应该在尽可能短的时间内完成。我们常用的方式是使用空间换时间,尽可能的快速响应用户的操作。
5. 响应速度
每个应用都应该快速地响应用户交互。在应用中所做的一切优化和权衡最终都应该体现在响应速度上。
6. 本地存储
用户都希望能够在无网络或者设备离线的情况下还可以浏览上次的内容,开发人员应该对本地存储的使用有所规划,以便应用具备离线浏览的能力。同时也需要提供一个清除物理存储空间与内存缓存空间的选项,物理存储空间占用过多,会使用户频繁的卸载这些应用来回收本地存储。内存消耗过多,也会导致应用被系统杀死,所以提供一个清理缓存的选项是很有必要的。
7. 网络请求
移动设备会在不同的网络环境下使用,为了确保能够提供最好的用户体验,你的应用应该适用于各种网络条件。而网络请求的响应速度会直接影响用户体验,如何做DNS优化,连接优化,弱网优化,是我们在优化过程中需要时刻关注的点。
8. 用户界面流畅度
这个主要是我们的列表视图,FPS过低会给用户一种卡顿感,这是一种很糟糕的体验,优化我们的TableView,提高渲染性能,给用户丝滑的体验感,是我们在接下来的优化中要做的。
9. 奔溃
高性能的应用不仅应尽可能地避免奔溃,还应该在奔溃发生时优雅地恢复,尤其是在进行某个操作的过程中发生奔溃时。奔溃后的自我修复方案与热更新方案可以帮到你。
10. 安全
安全对移动应用来说是最重要的,因为敏感信息会在应用程序间共享,因此对通信数据与本地共享数据进行加密就非常重要了。但是加密过程需要更多的计算会存储空间,但是这与最大化运行速度,最小化内存使用的目标相冲突。因此,我们需要在安全和其它因素之间进行权衡。
为什么要写性能优化系列文章
优化不要做的太早,性能是后来才会考虑的事情,从某种程度上来看,我认同这种观点,毕竟最重要的是先完成功能需求。但是如果你在开发初期就已经有一套自己的优化方案与思想,你在开发过程中就可以使用最优化的代码与策略进行开发,优化与开发同时进行,开发即优化,我觉得这是一种很不错的方式,同时也会大大减轻后期优化的工作量。
写优化系列的文章是想让自己走的更深一点,将自己理解的优化方案抛出来供大家参考,这个过程中会出现各种不同优化思想之间的碰撞,这才是最有趣的,既提升了自己,又方便了大家,何乐而不为~
性能优化系列文章规划
性能优化系列文章,会从我们平常开发的各个点出发给出优化方案与建议,每个点都会最终落地成代码,或者第三方工具,不做标题党,每个优化方案都是本人经过测试,对比,量化之后的成果,在这个过程中也希望可以收获大家的一些优化方案与思想,共同进步。
关于更博的规划,我目前的性能优化篇博文目录如下:
大概 12到 15篇文章,预计在7月中旬完成所有性能优化更博计划,中间会穿插一些其它非性能优化篇的博文,希望各位看官能喜欢~