SKILL.md
readonly只读
name
xcode-compilation-analyzer
description
使用构建时间摘要和Swift前端诊断来分析Swift及混合语言编译热点,然后生成优先推荐源码级优化方案。当开发者报告编译缓慢、类型检查警告、昂贵的干净构建编译阶段、长时间的CompileSwiftSources任务、warn-long-function-bodies输出,或希望加速Swift类型检查时使用。
Xcode 编译分析器
当编译时间(而不仅仅是项目配置)看起来是瓶颈时,使用此技能。
核心规则
- 从证据出发,最好是最近的
.build-benchmark/产物或原始时间摘要输出。 - 在调查期间,优先使用仅分析性的编译器标志,而不是持久性的项目编辑。
- 按预期的挂钟时间影响对发现进行排序,而不是累积的编译时间影响。当编译任务高度并行化时(编译类别总和 >> 挂钟时间中位数),请注意修复个别热点可能会提高并行效率,但不会减少构建等待时间。
- 当证据指向并行工作而非串行瓶颈时,将建议标记为“减少编译器工作量(并行)”,而不是“减少构建时间”。
- 未经开发者明确批准,不得编辑源代码或构建设置。
检查内容
- 干净构建和增量构建的
Build Timing Summary输出 - 长时间运行的
CompileSwiftSources或每个文件的编译任务 SwiftEmitModule时间——在大型模块中,单行更改后可能达到60秒以上;如果它在增量构建中占主导地位,则模块可能过大或宏过多Planning Swift module时间——如果此类别在增量构建中异常大(每个模块高达30秒),则表明意外的输入失效或宏相关的重建级联- 临时运行以下标志:
-Xfrontend -warn-long-expression-type-checking=<ms>-Xfrontend -warn-long-function-bodies=<ms>
- 用于深入调查的诊断标志:
-Xfrontend -debug-time-compilation—— 每个文件的编译时间,用于排序最慢的文件-Xfrontend -debug-time-function-bodies—— 每个函数的编译时间(未过滤,补充基于阈值的警告标志)-Xswiftc -driver-time-compilation—— 驱动级时间,用于隔离驱动开销-Xfrontend -stats-output-dir <path>—— 每个编译单元的详细编译器统计信息(JSON),用于根本原因分析
- 增加桥接工作量的混合 Swift 和 Objective-C 接口
分析工作流
- 确定主要问题是广泛的编译量还是少数极端热点。
- 解析时间摘要类别,并对最大的编译贡献者进行排序。
- 运行诊断脚本以发现类型检查热点:
这将生成一个超过毫秒阈值的函数和表达式的排序列表。结合诊断产物和源码检查,优先关注最昂贵的文件。python3 scripts/diagnose_compilation.py \ --project App.xcodeproj \ --scheme MyApp \ --configuration Debug \ --destination "platform=iOS Simulator,name=iPhone 16" \ --threshold 100 \ --output-dir .build-benchmark - 将证据映射到具体的建议列表。
- 将代码级建议与项目级或模块级建议分开。
Apple 派生的检查
首先查找以下模式:
- 在昂贵的表达式中缺少显式类型信息
- 难以进行类型检查的复杂链式或嵌套表达式
- 委托属性类型为
AnyObject而不是具体协议 - 过大的 Objective-C 桥接头文件或生成的 Swift 到 Objective-C 接口
- 跳过框架限定且错过模块缓存重用的头文件导入
- 从未被继承但缺少
final的类 - 内部符号上过于宽泛的访问控制(
public/open) - 应分解为子视图的庞大 SwiftUI
body属性 - 没有中间类型注释的长方法链或闭包
报告格式
对于每个建议,包括:
- 观察到的证据
- 可能受影响的文件或模块
- 预期的等待时间影响(例如“预计将干净构建减少约2秒”或“减少并行编译工作,但不太可能减少构建等待时间”)
- 置信度
- 是否需要批准才能应用
如果证据指向项目配置而非源代码,请通过阅读其 SKILL.md 并将工作流应用于同一项目上下文,将其移交给 xcode-project-analyzer。
首选策略
- 在推荐持久性构建设置更改之前,建议通过构建命令临时注入标志。
- 优先将庞大的视图构建器、闭包或结果构建器表达式缩小为更小的类型化单元。
- 当显式导入和协议类型化能减少编译器搜索空间时,推荐使用。
- 指出混合语言边界是真正问题,而不仅仅是 Swift 语法本身。
附加资源
- 详细审计清单,请参见 references/code-compilation-checks.md
- 共享建议结构,请参见 references/recommendation-format.md
- 来源引用,请参见 references/build-optimization-sources.md






