其他
QQ 9“傻快傻快”的?!带你看看背后的技术秘密
👉目录
1 仍有5亿人坚持用 QQ
2 吹毛求疵的打磨
3 轻盈焕新的 QQ 9
4 总结和展望
01
02
T0:点击图标到 main 函数开始; T1:从 main 函数开始到 didFinishLaunchingWithOptions 结束; T2:didFinishLaunchingWithOptions 结束到首帧渲染完成。
pre-main 阶段:系统 dyld 加载 App 镜像和初始化行为,与程序结构和规模关系较大。 post-main 阶段:App 在渲染上屏前做的业务初始化行为,与具体业务逻辑关系较大。
pre-main 阶段降低加载和链接的耗时:如动态链接转为静态链接,代码拆分组成动态库并进行懒加载。 post-main 阶段减少主线程所执行的代码总量:如代码下架,代码执行时机延后或异步子线程化,代码逻辑执行效率优化等。
使用 __attribute__((objc_runtime_visible)) 实现低成本代码动态化改造。 使用 objc_setHook_getClass 实现动态化代码入口收敛,保证了方案稳定性。
系统调度行为、系统级线程(比如 PageIn 线程)抢占。 APP 频繁开辟子线程却不注意管理子线程的数量,可能会出现「线程爆炸」的情况,而且子线程不恰当地设置 QoS,会容易导致主线程被抢占。 主线程任务过重,占用时间片过长,会被系统惩罚降级,然后被其他子线程抢占。
__QOS_ENUM(qos_class, unsigned int,
QOS_CLASS_USER_INTERACTIVE = 0x21, // 33
QOS_CLASS_USER_INITIATED = 0x19, // 25
QOS_CLASS_DEFAULT = 0x15, // 21
QOS_CLASS_UTILITY = 0x11, // 17
QOS_CLASS_BACKGROUND = 0x09, // 9
QOS_CLASS_UNSPECIFIED = 0x00, // 0
);
其实这里还有一些优化空间,我们将第一个 RunLoop 的任务都挪到第二个 RunLoop 了,就又导致第二个 RunLoop 耗时较大,可以按照此思路继续优化。
屏幕上显示的内容只能在主线程更新(只能单核,无法利用到手机的多核 CPU)。 影响 GPU 的耗时因素多,展示的界面越复杂耗时越多。
善用多线程编程,尽可能少在主线程上做更新 UI 以外的事情。 尽可能让 GPU 绘制简单的界面,减少 GPU 耗时。
恰好是上次所用的节点或者内容恰好相同:相同内容赋值,没有任何变化。 没有相关动/静图:内容从无到有,符合预期。 有相关动/静图,但与当前 Model 的内容不一致:出现闪烁。如图下图所示。
Myers:计算结果保存在changes的数组内,其中只有insert、remove两种类型。(来源:Swift Diffing)
删 + 移 → 删 + 增: 数据集A:[1, 2, 3, 4, 5]->数据集B:[2, 3, 5, 4]。会删除1、4,接着插入4。 移 + 删 → 移 + 删: 数据集A:[1, 2, 3, 4, 5]->数据集B:[1, 2, 4, 3]。会交换3、4,随后删除5。
能够记录节点之间的移动关系,并不是通过插入、删除的联系推断移动。 具备较低的时间复杂度与空间复杂度。
PASS1. 建立新数据所需新索引数组(NA)与 Symbol Table 之间的关系 PASS2. 建立老数据所需旧索引数组(OA)与 Symbal Table 之间的关系。 PASS3. 查找位置没有变化的节点,更新新旧索引数组(NA、OA)中的索引信息。 PASS4 - PASS5:适用于对两个本文进行比较的 Case(存在 Key 值相同的情况),在 QQ 的应用场景中不允许出现相同 Key 值的情况,可跳过。感兴趣的同学可以直接查阅论文。 PASS6. 根据现有结果计算差异,如图下图所示:
并行布局 N 条消息的总耗时还是比串行布局一条消息的耗时要大得多,受限于 CPU 核心数,代码中的锁或其他资源竞争导致 N 条消息的参数准备和布局计算没有能充分的并行。 这N条消息的布局任务分别和 N 个 GCD 任务一对一绑定了,GCD 调度这 N 个任务中有任何一个调度慢都会拉长整个预布局的耗时。
主干合流门禁:对于较稳定的性能指标,合流前自动检查。 日常自动提单:针对偶现的性能问题,开发阶段提前发现。 性能数据看板:常态化详细数据看板,上帝视角观测性能。 告警机器人:自定义各性能维度告警规则,第一时间反馈问题。
Xcode 12 开始提供了 xctrace,其 Release Notes 中解决的很多 issue 也来自于手 Q 团队在防劣化开发过程中发现与反馈。在性能优化方面 QQ 与 Apple 性能团队交流紧密,大家也会加班克服中美时差。
03
04
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)