这是我参与【第四届青训营】笔记创作活动的第五天,在这总结一下相关的性能优化工具,以及学习到的如何优化的方法和思想
前言
性能优化的目的总结下来就是快,稳,省,即优化体验。产品流畅度更高,闪退等异常问题出现较少或不出现,占用的内存,CPU也少。
最佳工具
GPU呈现模式
原理:系统通过记录每一帧的相关数据,然后通过图形的形式呈现
优点:无需二次开发,简单易用
缺点:并不完全准确,且无法明确指出造成卡顿问题的具体原因
Layertool
原理:通过遍历ViewTree信息,输出view层级关系 优点:清楚明了,可以宏观感知ViewTree现状,也可以定制,帮助分析overdraw 缺点:还不能够清楚明确的分析出UI的性能瓶颈
CPU Profiler
原理:基于JVMTI 优点:完整的方法调用栈输出、支持Java、C、C++方法耗时检测、上手简单 缺点:性能损耗太大
TraceView
- lnstrument
虚拟监听函数入口回调, Enter/Exit/Unwind
耗时点:读时间、写数据到buffer.加锁等指令
- Sample
通过定时抓取多次堆栈diff,近似确定函数的进入和退出时间
耗时点:堆栈diff、同Instrument.间隔抓取堆栈的时间越长性能损耗 越少,而越会导致短函数检测不到
Systrace
-
ftrace: debugfs采集和读取trace数据,记录trace
-
eventsatrace:用户侧的trace跟踪,聚合所有的trace event
-
系统级的Trace数据:锁监控等
Battery Historian
监控一段时间内所有功耗因子的工具
将一段时间内的所有功耗都采集到,然后准确分析这段时间内各个因子的功耗情况
如何优化
现状分析
耗时成因
-
CPU Time 循环,反射,序列化/反序列化,类解析
-
lO Wait Io操作,等待Io返回结果
-
IPC Binder 调用耗时
-
Lock Wait 主线程是等锁状态,等待其他线程或者自己超时唤醒
-
CPU Schedule 主线程是可执行状态,但是获取不到cPu时间片
运行环境归因
- 根据耗时成因归类
- 根据运行所在线程环境采用不同的策略
渲染分析
优化策略
UI构建
耗时成因: xml lO、class反射、创建view、Asset资源大锁
解决方案:
AndInflater:解决xml性能问题-外界方案
X2CLegolnflate :高优先级的启动预加载方案
AsyncInflater:随时随地预加载,不与具体逻辑绑定,生命周期存活,自定义清理周期
渲染耗时优化
- 移除不必要的背景图
- 修改不合理布局
- 写高效合理的布局
- 移除默认的Window背景
- 绘制层级优化
异步渲染
主要思想是主线程我们只进行交互,渲染采用独立的线程,这样降低耦合
- SurfaceView:采用独立的线程进行绘制和渲染,生命周期需要自己控制
- Jetpack Compose:基于组合优于继承的思想,重新设计一套解耦的Ul框架
- Litho :复杂UI下的高性能渲染框架
总结
这节课我学习到了性能优化可以优化的是那些方面,并且了解到很多优化的工具,在工具选型方面,要洞察程序内部的瓶颈,层层分析,发现问题之后再选择。最后学到了通过那些方式进行优化,让我很有体会的是异步渲染,主线程只进行交互,使用独立的线程进行渲染,来降低耦合,这种思想对于我以后的编程很有帮助。