Demystify parallelization in Xcode builds
Developer Tools 进阶 20m

揭秘 Xcode 构建中的并行化

Demystify parallelization in Xcode builds

2022年6月6日

在 Apple 官方观看视频

一句话判断

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