这是我参与「第四届青训营 」笔记创作活动的第9天
初识性能优化及工具
本堂课内容
- 为什么做性能优化?
- 性能优化是什么?
- 最佳性能工具选型?
- 如何做性能优化?
知识点介绍
为什么要做性能优化
在产品实际上线的过程中,性能优化带来体验的改善,进而帮助业务指标提升。
从硬件的范围来看,目前硬件性能提升的速度在变慢,随着arm平台的架构和工艺的演进,目前已经逐渐的比x86的。且在硬件提升的范围内来看, 硬件上的提升的水平逐渐的在变小。
未来会有新的材料和工艺来驱动芯片性能的提升, 但是目前需要时间的等待。
软件的提升水平相比硬件来说要大
性能优化是什么
快、稳、省
流畅性优化
页面是需要通过主线程之中的UI Drawing来绘制的,当UI Drawing的渲染发生丢失的时候,表现在系统上就会让使用者感到丢帧。
而确保能在规定时间内将所需的界面绘制出来,需要依靠VSync系统来控制硬件的工作。
资源优化
资源:即系统中的软件和硬件资源,通俗意义上来说就是CPU,内存,流量,电量等等
我们可以做哪些资源优化?
- 端侧资源有功耗、内存、存储、CPU、GPU、网络、音量、亮度等等
- 服务侧资源有CDN宽带、API流量
不同的应用色系会带来不同的功耗差异、不同的亮度也会带来不同的功耗差异
稳定性优化
ANR,即应用程序无响应。如果Android应用的界面线程处于阻塞状态的时间过长,就会触发APP ANR错误。如果应用位于前台,系统会向用户显示一个对话框,来询问用户是否要强制关闭这个应用
系统级优化
系统级优化需要移动操作中系统和硬件厂商共同配合来达到性能优化,包括对虚拟机的优化,对系统内核的优化和对硬件的优化等等。
最佳工具选型
GPU的呈现模式
原理:系统通过记录每一帧的相关数据,然后通过图形的形式呈现
优点:无需二次开发,简单易用
缺点:并不完全准确,且无法明确的指出造成卡顿问题的主要原因
Layertool
原理:通过遍历ViewTree信息,输出View层级关系
优点:清楚明了,可以宏观感知ViewTree现状,也可以定制,帮助分析overdraw
缺点:还不能够清楚明确的分析出UI的性能瓶颈
CPU Profiler
原理:基于JVMTI
优点:完整的方法调用栈输出,支持Java、C、C++方法耗时检测、上手简单
缺点:性能损耗太大
TraceView
- Instrument
- 虚拟监听函数入口回调
- 耗时点:读时间、写数据到buffer、加锁等指令
- Sample
- 通过定时抓取多次堆栈diff,近似确定函数的进入和退出时间
- 耗时点:堆栈diff、同Instrument
- 间隔抓取堆栈的时间越长性能损耗越少,而越会导致段函数检测不到
如何优化
现状分析
耗时成因
CPUTime:循环,反射,序列化/反序列化,类解析
IO Wait:IO操作,等待IO返回结果
IPC:Binder调用耗时
LockWait:主线程等锁状态,等待其他线程或者自己超时唤醒
CPU Schedule:主线程是可执行状态,但是获取不到CPU时间片
运行环境归因
- 根据耗时归因归类
- 根据运行所在线程环境采用不同的策略
优化策略
UI构建、数据绑定、View显示
UI构建解决方案:AsyncLayoutInflater
Ggon解析优化,数据协议优化
个人总结
性能优化在产品的整个生态中是至关重要的,如果一个产品的性能优化不好,则会给用户带来不好的使用体验,严重甚至可能会放弃对产品的使用。
在性能优化中,需要了解很多关于系统底层的知识,包括UI的渲染, 系统对于资源的调用,包括电量,颜色等等一切可能影响到功耗的因素,这就需要性能优化的工程师对于系统十分了解。
如果说开发人员是一个厨师的话,那么性能优化人员就相当于一个装菜员,他需要把生产出来的产品,在不改变业务逻辑的情况下体验更好。