SwiftUI Performance Audit 是一个用于诊断 SwiftUI 运行时性能问题的技能,强调“代码优先”的排查思路:先审查代码,再在必要时请求性能剖析证据。
用途 适用于诊断渲染缓慢、滚动卡顿、更新开销过大、CPU 占用高、内存增长、卡死(hangs)或视图更新过于频繁等问题。
工作流程
- 对症状进行分类:渲染缓慢、滚动卡顿、高 CPU、内存增长、卡死或视图更新过多。
- 若可获取代码,先依据 references/code-smells.md 进行代码优先审查。
- 若无法获取代码,则索取最小可用信息:目标视图、数据流、复现步骤和部署目标。
- 若代码审查无法得出结论或需要运行时证据,则依据 references/profiling-intake.md 引导用户进行性能剖析。
- 依据 references/report-template.md 汇总可能原因、证据、修复方案和验证步骤。
信息收集(Intake) 需要收集:目标视图或功能代码;症状与精确复现步骤;数据流(@State、@Binding、环境依赖和可观察模型);问题出现在真机还是模拟器,以及是在 Debug 还是 Release 下观察到的。并请用户尽量对问题分类:CPU 峰值或耗电、滚动卡顿或掉帧、高内存或图片压力、卡死或交互无响应、视图更新过多或范围异常宽泛。
代码优先审查 重点关注:由宽泛观察或环境读取引发的失效风暴(invalidation storms);列表和 ForEach 中不稳定的标识(identity);body 或视图构建器中的重型派生计算;复杂层级、GeometryReader 或 preference 链导致的布局抖动(layout thrash);主线程上的大图解码或缩放;应用范围过广的动画或过渡。审查后给出带代码引用的可能根因、建议的修复与重构,必要时提供最小复现或插桩建议。
引导性能剖析 若代码审查无法解释问题,则索取运行时证据:SwiftUI 时间线与 Time Profiler 调用树的 trace 导出或截图、设备/系统/构建配置、被剖析的确切交互,以及用户对比改动时的前后指标。
分析与诊断 将证据映射到最可能的类别:失效、标识变动、布局抖动、主线程工作、图片开销或动画开销。按影响而非解释难度排序问题,区分代码层面的怀疑与 trace 支撑的证据,并指出剖析仍不充分之处以及还需哪些额外证据来降低不确定性。
修复(Remediate) 采取针对性修复:收窄状态作用域、减少宽泛观察的扇出;稳定 ForEach 和列表的标识;将重型工作移出 body,改为由输入更新的派生状态、模型层预计算、记忆化辅助函数或后台预处理,@State 仅用于视图自有状态而非任意计算的临时缓存;仅在相等比较比重算子树更廉价且输入确为值语义时使用 equatable();渲染前对图片降采样;降低布局复杂度或尽可能使用固定尺寸。
验证 请用户重新执行相同采集并与基线指标对比,若提供则汇总差值(CPU、掉帧、内存峰值)。
输出 提供简短指标表(如有前后对比)、按影响排序的顶部问题、带预估工作量的修复建议,并使用 references/report-template.md 格式化最终审计报告。
参考资料 包括:references/profiling-intake.md(剖析信息收集清单)、references/code-smells.md(常见代码坏味道与修复模式)、references/report-template.md(审计输出模板),以及 Apple 文档与 WWDC 资源:references/optimizing-swiftui-performance-instruments.md、references/understanding-improving-swiftui-performance.md、references/understanding-hangs-in-your-app.md、references/demystify-swiftui-performance-wwdc23.md。此外,当 Instruments 工作流或 SwiftUI 性能指南可能已变化时,可使用网络搜索查阅最新的 Apple 开发者文档。
限制 该技能以代码审查为起点,运行时结论依赖用户提供的剖析证据;资料未提供具体收费、价格、平台支持范围或效果保证等信息。