关联知识库:QQ9性能优化技术深度解析
QQ9性能优化技术深度解析
基于腾讯QQ团队《QQ 9"傻快傻快"的?!带你看看背后的技术秘密》技术文章整理
优化成果概览
- 用户基础:5亿用户坚持使用QQ
- 流畅度提升:50分位提升35%
- 卡顿率降低:降低48%
- 启动耗时优化:降低40%
- 技术革新:从底层架构自底向上全部重构
启动速度优化:极致秒开策略
Pre-main 阶段优化
核心技术:动态库懒加载
- 使用
__attribute__((objc_runtime_visible))
实现低成本代码动态化改造 - 使用
objc_setHook_getClass
实现动态化代码入口收敛 - 效果:贡献了33%左右的启动总耗时优化
技术原理:
// 动态化代码改造示例
__attribute__((objc_runtime_visible))
@interface DynamicClass : NSObject
@end
// 动态化代码入口收敛
objc_setHook_getClass(originalClass, newClass);
Post-main 阶段优化
线程治理三大策略:
-
减少子线程数量
- 避免GCD全局队列导致的"线程爆炸"
- 使用target_queue设置队列层级结构
- 参考WWDC17《Modernizing Grand Central Dispatch Usage》
-
降低子线程QoS
- 网络请求、磁盘I/O等任务QoS从
QOS_CLASS_USER_INITIATED
降低 - QoS优先级排序:USER_INTERACTIVE > USER_INITIATED > DEFAULT > UTILITY > BACKGROUND
- 网络请求、磁盘I/O等任务QoS从
-
提高主线程优先级
- 通过RunLoop任务拆分避免系统降级惩罚
- 第一个RunLoop保留必要全局初始化,主UI创建延迟到下一个RunLoop
性能流畅度提升:"众"享丝滑
流畅度定义与挑战
- 目标:16.67ms内完成用户操作到屏幕更新的全流程
- 挑战:主线程单核限制 + GPU绘制复杂度
- 优化原则:主线程减负 + GPU简化
核心技术突破
1. NT内核架构
设计理念:基于多核CPU能效理念设计
- C++实现核心能力,跨平台一致性
- 异步调用替代线程锁,降低死锁风险
- 业务处理逻辑从主线程剥离
架构优势:
NT Kernel 多线程模型
├── 主线程:UI展示
├── 子线程:业务处理
└── 异步调用:避免线程锁
2. 增量刷新 vs 全量刷新
传统问题:
- 14年老版本全量刷新导致滚动卡顿
- 资源跳变、节点随机重用
- 异步加载数据出现闪烁
创新方案:Heckel Diff算法
- 时间复杂度:O(m+n)
- 能够记录节点之间的移动关系
- 区分直接移动与间接移动,过滤冗余操作
算法流程:
PASS1: 建立新数据索引数组与Symbol Table关系
PASS2: 建立老数据索引数组与Symbol Table关系
PASS3: 查找位置没有变化的节点
PASS6: 计算差异(删除、更新、移动)
3. 并行预布局
初始方案问题:
- N条消息N个线程,存在资源竞争
- 任务绑定导致调度延迟
优化方案:M个执行者处理N条消息
- 动态任务分配,避免绑定关系
- 充分利用多核CPU算力
- 性能提升:布局计算总耗时减少约76%
实现逻辑:
// 伪代码示例
class LayoutExecutor {
void processMessages(MessageQueue& queue) {
while (!queue.empty()) {
Message msg = queue.pop();
calculateLayout(msg);
}
}
};
// 主线程 + GCD调度(M-1)个线程
LayoutExecutor mainExecutor;
for (int i = 0; i < M-1; i++) {
dispatch_async(globalQueue, ^{
LayoutExecutor executor;
executor.processMessages(messageQueue);
});
}
4. 异步渲染优化
GPU离屏渲染问题:
- 上下文切换开销大
- 需要额外Frame Buffer
- 性能损耗严重
解决方案:多核CPU异步渲染分担GPU工作
- 利用多核CPU并行处理
- 解决快速滑动时的"闪白"问题
- LRU缓存 + 增量刷新
️ 防劣化系统:Hodor守护者
系统架构
核心技术栈:
- Instruments动态追踪技术
- xctrace自动解析trace文件
- 构建门禁 + 自动提单 + 数据看板
功能模块:
Hodor防劣化系统
├── 主干合流门禁
├── 日常自动提单
├── 性能数据看板
├── 告警机器人
└── 设备用例管理
覆盖平台:iOS/Android/Windows/macOS/Linux
质量保障策略
- 左移检测:开发阶段提前发现性能问题
- 自动化门禁:合流前自动检查性能指标
- 精准归因:堆栈分析 + 智能调度
技术亮点总结
性能优化原则
- 主线程减负:尽可能少在主线程做UI更新以外的事情
- GPU简化:让GPU绘制简单界面,减少绘制耗时
- 多线程并行:充分利用多核CPU算力
- 异步化处理:避免阻塞,提升响应速度
架构设计理念
- 分层解耦:核心能力与UI展示分离
- 跨平台一致:C++核心 + 原生UI
- 资源管理:智能预加载 + 回收机制
- 质量保障:全流程监控 + 自动化检测
可复用经验
启动优化
- 动态库懒加载策略
- 线程治理与QoS管理
- RunLoop任务拆分技巧
流畅度提升
- 增量刷新算法选择
- 并行预布局实现
- 异步渲染优化方案
质量保障
- 防劣化系统设计
- 性能监控与告警
- 自动化测试与门禁
参考资料
- QQ 9"傻快傻快"的?!带你看看背后的技术秘密
- WWDC17《Modernizing Grand Central Dispatch Usage》
- 《Advanced Graphics and Animation Performance》
- 《Explore UI animation hitches and the render loop》
- 《A technique for isolating differences between files》
本文档基于腾讯QQ团队技术分享整理,仅供技术学习参考。