启动优化思考
在面试时遇到这个问题,很多人信手拈来,上来就说:+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 层
****** 利用数据加载的空闲时间预渲染预渲染
****** 减少离屏渲染
防止劣化
- 上线前:自动化测试对比
- 上线后:线上监控