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

98 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第 7 天。

今天开始实践二的开发学习,便复习了周三时《初识性能优化》这门课的笔记,也系统整理了一遍发出来大家一起学习。下面开始正式内容


一、本堂课重点内容

  1. 为什么要做性能优化
  2. 性能优化是什么
  3. 有哪些性能工具选型
  4. 如何做性能优化

二、详细知识点介绍

  1. 为什么要做性能优化

    1. 更好的体验和回报:性能优化能带来体验的改善、业务指标的提升
    2. 硬件性能优化速度变慢:软件的提升可以独立于硬件,而近几年的硬件优化性能变慢,软件提升才能获得更好的提升
    3. 为了适应未来更大的需求:寻求技术的进步
  2. 性能优化是什么

    1. 性能优化的目标:更快、更稳、更省

      1. 快:响应速度更快、交互快
      2. 稳:避免闪退等问题
      3. 省:储存、缓存空间、功耗更小
    2. 性能优化的分类

      1. 流畅性优化:机制的响应与流畅的体验

      2. 资源优化:最小负载带来最大的收益

      3. 稳定性优化:稳定的实现、减少不必要的打断

      4. 系统级优化:扩展—底层booster

        1. 让APP在有限的资源里获得更多的资源、更快的运行
    3. 流畅性优化

      1. Android的线程结构: image-20220814002553410

      2. 界面是怎么刷新的:硬件发出vsync信号,保证没16毫秒刷新一次

      3. 卡顿是怎么产生的(三种原因):

        图片2

      4. 解决卡顿:

        1. 耗时操作转移到其他线程
        2. 主线程只负责交互和刷新。
    4. 资源优化

      1. 资源是什么:

        1. Android的软件和硬件资源。
        2. 一般指应用依赖的移动端的有限资源和系统设置的数值
        3. 即功耗、存储、流量、系统参数、CPU和内存等
      2. Android能做那些资源类的优化

        image-20220814004903968

    5. 稳定性优化

      1. 稳定性存在的问题:

        image-20220814005246202

      2. ANR是什么

        1. Application Not Responding的缩写,程序无响应
        2. 如果Android应用的界面线程处于阻塞状态的时间过长,会触发App ANR错误。如果应用位于前台,系统会向用户显示对话框提供退出应用或等待的选项。
        3. 避免出现长时间卡顿,而采取的强制性退出方案
    6. 系统级优化:

      image-20220814010055717

  3. 最佳性能工具选型

    1. 要求:

      1. 消耗小:性能监控要求消耗很小
    2. GPU呈现模式(初步发现问题):

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

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

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

        image-20220814010523419

    3. Layertool(字节自主开发)

      1. 原理:通过遍历ViewTree信息,输出View的层级关系
      2. 优点:清除明了,可以宏观感知ViewTree现状,也可以定制,帮助分析oveerdraw
      3. 缺点:还不能明确分析出UI的性能瓶颈
    4. CPU Profiler(AS自带)

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

      1. Instrument

        1. 虚拟监听入口回调 Enter / Exit / Unwind
        2. 耗时点:读时间、写数据到buffer,加锁等指令
      2. Sample(采样模式)

        1. 通过顶是抓取多次堆栈diff,近似确定函数进入和退出时间
        2. 耗时点:堆栈diff、同Instrument
        3. 间隔抓取堆栈的时间越长性能损耗越少,而越会导致短函数检测不到
    6. Systrace(goolge提供)

      1. ftrace:debugfs菜鸡和读取trace数据,记录trace events
      2. atrace:用户侧的trace跟踪,聚合所有的trace event
      3. 系统级Trace数据:锁监控 等
    7. btrace(aka rhea)-进阶

      1. rhea-systrace:全函数插桩,自动生成Trace代码,对层数做限制,性能损耗50%
      2. rhea-mtrace:全函数插桩,抛弃systrace,自己统计函数耗时,最后数据展现同systrace
      3. rhea-atrace:优化systrace,集合更多性能数据:类加载、lock、IO等。
    8. Battery Hisorian

      image-20220814011917749

      1. 监听一段时间的功耗因子(图为使用流程)
  4. 如何做性能优化

    1. 现状分析

      1. 耗时起因

        1. CPU Time:循环,反射,序列化 / 反序列化,类解析
        2. IO Wait:IO操作,等待IO结果
        3. IPC(为并发做提升):Binder调用耗时
        4. Lock Wait:主线程是等锁状态,等待其他线程或者自己超时唤醒
        5. CPU Schedule:主线程是可执行状态,但是获取不到CPU时间片
      2. 运行环境归因

        1. 主线程耗时
        2. 运行时耗时
        3. 后台进程耗时
      3. 渲染分析

        1. 过程

          image-20220814013238007

          image-20220814013458930

      4. 抖音耗时分析

        image-20220814013146705

    1. 性能策略

    2. 案例分析

      image-20220814014226710

      1. 分步优化

        1. UI构建:xml IO、class反射、创建view、Asset资源大锁

          1. 抖音解决方案:AsyncLayoutInflater
        2. 渲染:

          1. 移除不必要的背景
          2. 修改不合理的布局
          3. 移除默认的Window背景
          4. 绘制层级优化:减少层级

三、课堂问答例子

  1. 人眼识别的不卡顿最小帧数:25帧

  2. 没有vsync信号会导致:画面撕裂

    1. 由于前一个没有绘制完,就来了新任务,导致部分绘制

      image-20220814004143994

    2. 一个布局从一个xml到View对象的耗时间

      image-20220814013609367

      IO操作、类反射、View初始化、AssertManager资源

四、课后小结

image-20220814014838980