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 层
    ****** 利用数据加载的空闲时间预渲染预渲染
    ****** 减少离屏渲染

防止劣化

  • 上线前:自动化测试对比
  • 上线后:线上监控
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、背景 距离上次启动优化(启动任务分级)相隔差不多2年时间了,虽然一直保持在之前的启动速度,但是每个版本排查启动...
    V_coa阅读 11,117评论 9 41
  • 一、背景 距离上次启动优化(启动任务分级)相隔差不多2年时间了,虽然一直保持在之前的启动速度,但是每个版本排查启动...
    iOS狂热者阅读 4,492评论 1 7
  • 多作者合集,非商业行为,为自己学习巩固。特此声明 启动APP的时候就会花费较长的时间,用户体验很不好。所以针对AP...
    红色海_阅读 4,132评论 0 2
  • 启动的过程一般是指从用户点击app图标开始到AppDelegate 的didFinishLaunching方法执行...
    思路不美阅读 2,924评论 0 1
  • 通过前面的探讨,我们知道内存分页触发中断异常 Page Fault 后,会阻塞进程,这个问题是会对性能产生影响。实...
    正_文阅读 14,852评论 13 80