Developer Tools 进阶 20m
揭秘 Xcode 构建中的并行化
Demystify parallelization in Xcode builds
2022年6月6日
一句话判断
Xcode 14 全新的 Build Timeline 可视化工具让你看清构建瓶颈在哪,配合对并行化原理的深入讲解,帮你把编译时间真正压下来。
这场 Session 讲了什么
构建速度是开发者每天都要面对的痛点。这场 Session 从 Xcode 构建系统的底层原理出发,解释了依赖图、关键路径、任务并行化等核心概念,然后介绍了 Xcode 14 中全新的 Build Timeline 工具。
Build Timeline 是一个基于并行化而非层级的可视化工具。横轴表示任务持续时间,纵轴表示并行度,颜色区分不同 target。空白区域代表被阻塞的任务——这些就是你的优化目标。
Session 分两个层面讲解并行化:target 内部(编译、资源处理、链接等任务的并行调度)和 target 之间(如何利用显式/隐式依赖关系最大化并行度)。每个层面都配合 Build Timeline 的实际演示,展示如何识别和缩短关键路径。
值得深挖的点
- 关键路径(Critical Path):这是决定构建最短时间的瓶颈。即使有无限硬件资源,构建也不能快于关键路径的长度。缩短关键路径的方法是拆解其中的长任务依赖链。
- Build Timeline 的解读方法:空白区域 = 被阻塞的任务。大量空白说明依赖链太长。宽条 = 耗时任务。不同颜色的宽条堆叠在一起说明并行度利用得好。
- 增量构建的 Timeline:只包含实际执行的任务,能帮你发现不该重新执行的任务——比如某个头文件的修改触发了不必要的全量重编译。
- Target 依赖设计:减少不必要的 target 间依赖可以大幅提升并行度。比如 Framework 和 App Extension 如果没有真正的代码依赖,就不要在 Build Phase 中设置链接关系。
代码片段
# 启用构建时间记录
# 在 Xcode 的 Build Settings 中设置:
# Write Build Timestamps File = YES
# 查看构建时间报告
# Xcode > Product > Build 后,在 Report Navigator 中查看 Build Timeline
# 命令行查看关键路径
xcodebuild build \
-scheme MyScheme \
-destination 'platform=iOS Simulator,name=iPhone 14' \
| xcpretty
最佳实践
- 定期用 Build Timeline 审视全量构建和增量构建的性能
- 将大型 Framework 拆分为更小的模块,减少不必要的编译依赖
- 检查 Header Search Paths 是否过于宽泛,导致修改一个头文件引发大量重编译
- 利用 Explicitly Build Modules(Xcode 14 新选项)减少模块依赖的隐式开销
- 在 CI/CD 中记录构建时间趋势,及时发现退化
还有什么值得关注
- “Get started with Xcode Cloud” 介绍了云端构建的配置方法
- “Author fast and reliable tests for Xcode Cloud” 讲解了如何优化测试在 CI 中的运行
- Swift Package 的模块化天然有利于构建并行化,考虑将大 target 拆分为 Swift Package
- Metal 3 的离线编译功能也遵循类似的”把耗时工作移到构建时”的理念
WWDC 2022