性能预算(performance-budgets)是一个面向 Expo React Native 应用的技能,用于在 iOS 与 Android 上对照预定义预算测量冷启动、卡顿、绘制调用、存储写入、包体积与内存,并在添加动画、Skia、列表等改动时守住性能底线。
主要能力
- 预算集中管理:十项预算存放在 quality-gates.json 的 "perf" 块,初始值来自 assets/perf-budgets.json,包括冷启动 < 1,000 ms、卡顿率 ≤ 10 ms/s、p95 帧 ≤ 17 ms、存储写入 p95 < 5 ms、每帧绘制调用 ≤ 1,000、每屏画布 ≤ 8、每平台 JS 体积 ≤ 6,000,000 字节且增长 ≤ ×1.1、内存 ≤ 150 MB。收紧预算需在首次设备报告后;放宽需设备报告、评审批准及 Gate-Change: 尾注和 check-budgets --allow 参数。
- 测量层模板:提供帧直方图与报告(120/90/60 Hz)、性能日志环形缓冲、写入时间摘要与基准、冷启动报告、PerfPort 与 Expo 适配器、冷启动标记、帧记录器、调试菜单 Performance 操作、基于 expo-sqlite/kv-store 的独立性能日志数据库、use-cold-start-mark 钩子、存储基准与 Jest 守卫、本地 Expo 模块 process-start(iOS sysctl、Android 进程启动时间)及 contracts/perf.json 契约。
- 代码规则检查:check-perf-code.mjs 检查每帧 React 状态更新、Skia 每帧分配、帧回调可停止性、记录器不自有回调、绘制调用上限、画布数量、运行时代码生成、Hermes V1、区域数据导入、Jest 时钟等。
- 包体积检查:check-bundle-size.mjs 对比各平台已提交基线,新增运行时依赖前需测量。
- 报告检查:check-perf-report.mjs 校验模拟器/模拟器回归运行及设备报告,支持 --sim-baseline-file 和 --memory 参数。
使用方式
- 合并 assets/perf-budgets.json 到 quality-gates.json "perf",运行 check-budgets.mjs。
- 按模板路径复制测量层文件,按 examples/wiring-the-measurement-layer.md 接线:组合根创建适配器、根布局启动决策中标记 JS 入口、首屏模型钩子使用 useColdStartMark、仅测试入口接入性能日志与调试操作。需要 npx expo install expo-application,并重建原生模块(EAS 或 npx expo prebuild --clean)。将 src/data/perf/tasks-benchmark.ts 中的种子与写入替换为应用最重的每次变更写入。
- 任何涉及动画、Skia、帧回调、列表或启动的改动,先读 references/performance-rules.md,再运行 check-perf-code.mjs。
- 新增运行时依赖时,导出两平台前后包并运行 check-bundle-size.mjs。
- 模拟器/模拟器回归:Release 内部变体,6 次冷启动,读取性能日志,运行 check-perf-report.mjs。
- 发布前由开发者提供每平台设备报告(5 次冷启动、帧记录、存储基准),运行 check-perf-report.mjs 并汇报数字。发布后读取现场指标(Xcode Organizer、Play Console Android vitals)并据此收紧预算。
- 从仓库根运行所有检查,修复每条 FAIL 直至输出 RESULT: PASS。
适用场景
- 添加动画、Skia 绘图、帧回调、列表或启动逻辑时的性能门禁。
- 新增运行时依赖前评估包体积影响。
- 发布前真机性能验证与发布后现场指标跟踪。
- 需要集中、受评审约束的性能预算管理的 Expo React Native 项目。
限制
- 测量真相仅来自真机 Release 内部变体构建;模拟器/模拟器仅用于与已提交基线比较,开发模式、模拟器计时不可作为预算依据。
- 冷启动仅统计由启动创建、非预热或后台启动的进程;首屏需标记为真实数据就绪,非加载指示器。
- 检查器仅知晓初始预算值;放宽已收紧值依赖尾注与人工评审。
- 性能日志仅存在于测试构建,不上传,只通过分享面板导出。
- Jest 中 performance.now 被模拟为 1 ms,存储测量需用 node:perf_hooks 并在设备上验证真实 I/O。
- 现场性能监控(Sentry tracing、MetricKit)属于独立的、需同意的崩溃报告与可观测性范畴。