本目录使用 XCTest Performance API 测量 StructuredLayout 的布局安装成本。
三条路径都会创建相同的 8 个业务 UIView,并完成:
- 创建 100 张代表性卡片。
- 安装布局约束。
- 调用一次
layoutIfNeeded()。
三条路径分别使用 Native Auto Layout、SnapKit 6.0.0 和 StructuredLayout。StructuredLayout 路径还包含 DSL 节点构建和嵌套 UILayoutGuide 的成本,这正是本 Benchmark 希望持续观察的抽象开销。
Benchmark 是独立 Swift Package。SnapKit 只存在于本目录的开发测试依赖中,不会成为 StructuredLayout 核心 Package 的传递依赖。
在 Benchmark 目录执行,并将 Simulator 名称替换成本机已有设备:
cd Benchmarks
xcodebuild \
-scheme StructuredLayoutBenchmarks-Package \
-destination 'platform=iOS Simulator,name=iPhone 17' \
test \
-only-testing:StructuredLayoutBenchmarks在 Xcode 中也可以打开 Benchmarks/Package.swift,选择 StructuredLayoutBenchmarks-Package Scheme 运行。
2026-07-15 的一次 Debug / iPhone 17 Simulator / iOS 26.5 测量:
| Path | 100 cards | Per card | Physical memory delta |
|---|---|---|---|
| Native Auto Layout | 39.5 ms | 0.395 ms | 495 KB |
| SnapKit 6.0.0 | 48.7 ms | 0.487 ms | 485 KB |
| StructuredLayout | 56.4 ms | 0.564 ms | 482 KB |
这次快照中,StructuredLayout 相比 SnapKit 的安装与首次布局约增加 7.6 ms / 100 张卡片,即约 0.076 ms / 张;相比 Native Auto Layout 约增加 0.169 ms / 张。内存差异处于本次测量噪声范围内。
这些数字不是跨设备承诺。Simulator、Debug 编译、系统负载和 Xcode 版本都会影响结果;提交性能结论前,应增加 Release 真机测试并重复采样。
- 该测试测的是布局创建阶段,不是滚动 FPS。
- 不应在 Cell 的每次
configure中重复安装布局;应在初始化阶段安装一次。 - 如果后续增加布局树 Diff、缓存或新的布局节点,应保留此基线并检查回归。
- XCTest 默认采样多次;以其输出的 average 和 relative standard deviation 为准。