iOS 启动优化

启动优化思考

在面试时遇到这个问题,很多人信手拈来,上来就说:+load、减少离屏渲染、二进制重排等。不得不说,针对这个问题,这确实很重要的一环,对于工作 3 年左右的工程师没有任何问题,但对于 > 5 年的高级研发工程师,是不是显得思考、方案不够系统化呢?(记住:面试时面试、盖楼是盖楼,我们可以稍微系统化思考一下这个问题)

5W2H 简单思考一下

  • Why:为什么需要做这件事,表面上是需要完成任务,但是我们可以去剖析对方让我们完成这件事背后的意义所在;
  • What:启动优化到底是个什么样的事情?是如何定义的?启动怎么算开始?怎么算结束?
  • Who:谁来做最合适方便?(谁被忽略了?谁是决策人?谁会受益?)
  • When:立项什么时候开始,什么时候结束?
  • Where:何处?在哪里做?从哪里入手?如:我们做哪个 app?是否可迁移到其他端等
  • How:怎么做?
  • How much:做到什么程度?数量如何?是否可量化?如何量化?

为什么做(Why)

  • 上级安排?
  • 用户反馈 app 慢、卡?
  • 还是我们可感知的慢、卡(定性)?
  • 还是通过各种数据对比(横向 app 对比,各种技术方案对比)发现慢、卡(定量)?

启动定义(What)

System Interface(Dyld 加载共享库和框架、初始化系统底层组件等) -> Runtime 初始化 -> UIKit 初始化 -> Application 初始化 -> 首帧 -> 用户可交互

建立指标(How much)

第一个 +load(如:n 个 A 的动态库中的 +load) or 进程创建时间等 -> 首页渲染完成(如:hook *** layoutSubviews + dispatch_async、动画结束等,对于视频类 app,视频启播第一帧可能更好)

优化方向(How)

  • 避免写 +load(减少缺页中断等)
  • 二进制重排(减少缺页中断等)
    ** 思考1:如何分析启动时缺页中断次数?
    ** 思考2:order_file 是什么?怎么来?怎么用?
  • 非首屏必需的任务(延后)
    ** 非必需启动的任务:延后调度
    ** 非首屏内容:延后加载、绘制
  • 首屏必需任务(提优、加速)
    ** 数据层
    ****** 提升首页请求优先级、预加载、本地缓存
    ****** 数据解析时加载图片、视频等
    ** UI 层
    ****** 利用数据加载的空闲时间预渲染预渲染
    ****** 减少离屏渲染

防止劣化

  • 上线前:自动化测试对比
  • 上线后:线上监控

你可能感兴趣的:(iOS 启动优化)