这是我参与「第四届青训营 」笔记创作活动的第6天
今天我们来继续探讨关于性能优化的一些知识,其中有4个问题是需要我们思考的:1.为什么要做性能优化? 2.性能优化是什么?3.最佳的性能工具选型4.如何做性能优化?我们将结合这4个问题进行逐一思考。
为什么要做性能优化
进行性能优化会带来体验的改善进而帮助业务指标的提升,同时,从更长远的角度来看,硬件的性能提升速度近年来进展缓慢,而ARM平台受益于架构和工艺的演进,近几年的趋势比X86平台要好。从更长的时间范围上来看,多核带来的提升取决于可以真正并行执行的部分,从而提升性能。
性能优化是什么
- 首先,性能优化的总体吗,目标是
快、稳、省
- 快:最快显示效率、最快网络速率、最快UI响应
- 稳:最佳用户体验,减少强打断
- 省:最低存储、最低功耗、最低流量消耗、最低计算资源
- 性能优化可以分为流畅性优化、资源优化、稳定性优化和系统性优化四类
流畅性优化
界面呈现是指从应用生成帧并将其显示在屏幕上的动作。要确保用户能够流畅地与应用互动,应用呈现每帧的时间不应超过 16ms,以达到每秒 60 帧的呈现速度)。 如果应用存在界面呈现缓慢的问题,系统会不得不跳过一些帧,这会导致用户感觉应用不流畅,我们将这种情况称为卡顿。所以,针对这种卡顿问题,作出流畅性优化是很有必要的。
资源优化
资源优化分为最大化资源调度和最小化资源使用。
最大化资源调度:最大资源调度分为两个方向,第一个方向将一些有限资源尽量向最影响体验的方向靠拢,首先要满足快,我们需要在网络、渲染等领域提供更多的资源。第二个方向,探寻更多的资源供给,首先要满足多,深度剖析系统资源使用,需要从系统层榨取更多的可用资源,也需要从用户敏感角度榨取更多资源,最终实现最大化资源调度。
最小化资源使用:需要对持续性的指标影响降到最低,首先要满足省,我们对功耗、存储、流量等指标在一些用户敏感度大于实际获得的体验的环境下,保障核心功能的体验。本质的原则就是保证业务基本面的前提下,通过降级或者优化等手段,将占用的资源做到最小。
稳定性优化
这个可以举一个例子:比如Android应用界面线程处处于阻塞状态时间过长,会触发APP ANR错误,此时系统会向用户弹出一个对话框,对话框会为用户强行退出应用或提醒用户等待。
系统性优化
一般来说是移动操作系统和硬件厂商的性能优化。
最佳工具选型
首先针对APP的性能问题,我们首先需要提供一个性能监控工具来帮助发现一些“坑”,这些坑包括包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。
- 针对快速流畅性找出问题,可以采用GPU呈现模式
- 快速找出布局问题采用layerTool
- 深入性能归因:初阶: CPU profiler 中阶:trance view 高阶:systrace
- 查出功耗问题:battery historian
如何进行性能优化
-
UI构建
在UI构建阶段中首先要对界面布局的xml文件进行解析,这会导致IO Wait耗时,在接下来要解析xml文件中的TagName从而获取对应View的class会用到反射、创建各子View实例并生成View树又会用到循环递归,两部分都会增加CPU Time的开销。 -
数据绑定
然后是数据绑定阶段,该阶段主要分两部分,一部分是对数据做请求、解析、适配,另一是部分是将适配好的数据填充进UI中,前一部分往往会涉及到Json解析成Data Class实例,这里就可能涉及反射、循环遍历嵌套的数据类结构等增加CPU Time的操作。 -
View显示
最后是View显示阶段,常见的measure、layout、draw三大渲染View的步骤就在其中,它们同样会产生递归遍历父子View的耗时,此外这里还涉及将应用层计算好的渲染View的数据传递给系统层做最终的像素点排布,那么必然又会产生IPC耗时