初识性能优化及工具|青训营笔记

110 阅读3分钟

这是我参与【第四届青训营】笔记创作活动的第五天,在这总结一下相关的性能优化工具,以及学习到的如何优化的方法和思想

前言

image.png 性能优化的目的总结下来就是快,稳,省,即优化体验。产品流畅度更高,闪退等异常问题出现较少或不出现,占用的内存,CPU也少。

最佳工具

GPU呈现模式

原理:系统通过记录每一帧的相关数据,然后通过图形的形式呈现

优点:无需二次开发,简单易用

缺点:并不完全准确,且无法明确指出造成卡顿问题的具体原因

image.png

Layertool

原理:通过遍历ViewTree信息,输出view层级关系 优点:清楚明了,可以宏观感知ViewTree现状,也可以定制,帮助分析overdraw 缺点:还不能够清楚明确的分析出UI的性能瓶颈

CPU Profiler

原理:基于JVMTI 优点:完整的方法调用栈输出、支持Java、C、C++方法耗时检测、上手简单 缺点:性能损耗太大

TraceView

  • lnstrument

虚拟监听函数入口回调, Enter/Exit/Unwind

耗时点:读时间、写数据到buffer.加锁等指令

  • Sample

通过定时抓取多次堆栈diff,近似确定函数的进入和退出时间

耗时点:堆栈diff、同Instrument.间隔抓取堆栈的时间越长性能损耗 越少,而越会导致短函数检测不到

image.png

Systrace

  • ftrace: debugfs采集和读取trace数据,记录trace

  • eventsatrace:用户侧的trace跟踪,聚合所有的trace event

  • 系统级的Trace数据:锁监控等

image.png

Battery Historian

监控一段时间内所有功耗因子的工具

image.png

image.png 将一段时间内的所有功耗都采集到,然后准确分析这段时间内各个因子的功耗情况

如何优化

现状分析

耗时成因

  • CPU Time 循环,反射,序列化/反序列化,类解析

  • lO Wait Io操作,等待Io返回结果

  • IPC Binder 调用耗时

  • Lock Wait 主线程是等锁状态,等待其他线程或者自己超时唤醒

  • CPU Schedule 主线程是可执行状态,但是获取不到cPu时间片

运行环境归因

  • 根据耗时成因归类
  • 根据运行所在线程环境采用不同的策略

渲染分析

image.png

image.png

优化策略

UI构建

耗时成因: xml lO、class反射、创建view、Asset资源大锁

解决方案:

AndInflater:解决xml性能问题-外界方案

X2CLegolnflate :高优先级的启动预加载方案

AsyncInflater:随时随地预加载,不与具体逻辑绑定,生命周期存活,自定义清理周期

渲染耗时优化

  • 移除不必要的背景图
  • 修改不合理布局
  • 写高效合理的布局
  • 移除默认的Window背景
  • 绘制层级优化

异步渲染

主要思想是主线程我们只进行交互,渲染采用独立的线程,这样降低耦合

  • SurfaceView:采用独立的线程进行绘制和渲染,生命周期需要自己控制
  • Jetpack Compose:基于组合优于继承的思想,重新设计一套解耦的Ul框架
  • Litho :复杂UI下的高性能渲染框架

总结

这节课我学习到了性能优化可以优化的是那些方面,并且了解到很多优化的工具,在工具选型方面,要洞察程序内部的瓶颈,层层分析,发现问题之后再选择。最后学到了通过那些方式进行优化,让我很有体会的是异步渲染,主线程只进行交互,使用独立的线程进行渲染,来降低耦合,这种思想对于我以后的编程很有帮助。