Implementation Result · B / P2 foundation
系统 CPU 候选、分核原始值与校准链已落地
本批次在 DATA-1 的原始数据链之上,补齐了多核 CPU 的可追溯候选值、PerCPUUsage 向量、iOS 17+ 路由审计字段、Session generation 质量统计,以及不依赖第三方库的 PerfDog 同时间窗校准工具。当前值仍保持 raw / candidate 双轨,不以候选值替换正式指标口径。
Approved scope
本批开发内容
SystemCPUUsage.CPU_TotalLoad 原样保留,兼容旧字段。
raw / enabledCPUCount 单独输出并标记 candidate。
保留 PerCPUUsage 原始数组和可解析的逐核负载。
Host 选择的 route 与实际 provider route 同时进入事件。
Session 记录 generation 数量与切换次数,差分不跨代。
JSONL + PerfDog CSV 对齐后生成 JSON 误差报告。
Data contract
新增字段与责任边界
候选归一化不裁剪到 0–100,也不覆盖 totalCPU。只有同一设备、同一场景、同一时间窗的 PerfDog/Xcode 对照完成后,才可以改变 UI 的展示口径。
Calibration utility
PerfDog 同时间窗校准入口
新增 MacApp/scripts/analyze-b-batch.py,只读解析 Perfowl Collector JSONL 和用户导出的 PerfDog CSV,按时间戳最近邻匹配(默认 ±0.75 秒),输出 AppCPU、TotalCPU raw、TotalCPU 核数候选、Send、Recv 五组比较。CSV 解析支持中英文时间/CPU/收发列名,并且只在表头明确标注 KB/s、MB/s 或 GB/s 时转换为 bytes/s;报告额外记录每个 quality 状态的样本数。
python3 MacApp/scripts/analyze-b-batch.py \
--collector /path/to/collector-000001.jsonl \
--perfdog /path/to/perfdog.csv \
--scenario scroll \
--output /path/to/b-batch-report.json| 比较项 | 候选门槛 | 工具行为 |
|---|---|---|
| AppCPU / TotalCPU | 平均绝对误差 ≤5 个百分点,且相对误差 ≤10% | 输出 candidate-pass 或 needs-review |
| Send / Recv | 相对误差 ≤10% | 按 bytes/s 比较,不把 KB/s 展示值当原始值 |
| 无 PerfDog 文件 | 不作推断 | 所有比较明确为 not-tested |
Real-device evidence
当前链接设备 · iOS 16.6.1 · 只读短采集
本轮使用当前连接的 iOS 16 真机和两个已安装银行类测试 App,目标身份均由 Bundle ID → PID 校验。由于两个进程均处于后台/挂起,本轮只用于验证 System/Network/身份/质量链,不作为前台 FPS/GPU 或 PerfDog 数值校准。
| 匿名目标 | 样本 | CPU | TotalCPU raw | 核心候选 | Network | 身份/前台 |
|---|---|---|---|---|---|---|
| 目标 App A | 29 | 0(后台/挂起) | 88.1–176.7% | 14.7–29.4%(6 核有效样本) | device scope;valid 及合法 0 | verified / 非前台 |
| 目标 App B | 29 | 0(后台/挂起) | 79.1–588.7% | 13.2–98.1%(6 核有效样本) | device scope;valid/missing/warmup | verified / 非前台 |
两轮首个 System 回包均为 warmup,没有将缺值写成 0。原始 Collector JSONL 仅保留在本机临时目录,公开文档不写入设备标识、Bundle ID 和 PID。
Verification ledger
代码与兼容性验证
| 层级 | 结果 | 结论边界 |
|---|---|---|
| Python Collector + calibration | 22/22 | 拓扑解析、分核数组、raw/candidate、缺核数不猜测、PerfDog 中英文列与显式 KB/s 转换、重复时间戳匹配、既有 Network/身份测试。 |
| Swift Core/UI | 36/36 | Codable、CSV 新列、路由参数、generation 质量、旧版 quality.json 解码和既有 UI/Session 链。 |
| Sidecar 构建 | 通过 | 内置 Collector 0.5.0,x86_64 PyInstaller 产物可生成。 |
| iOS 版本路由 | 静态矩阵通过 | 16→legacy-usb;17.0–3.x→usb;17.4+ / 18.x→usbmux route 选择逻辑已覆盖。 |
| 当前真机 | 2 目标通过 | iOS 16.6.1、后台短采集;未覆盖 iOS 17+ 真机和前台场景。 |
Gate status
B 批次仍待完成的验收输入
需要用户提供/操作
- 把目标 App 保持在前台,依次执行静止、匀速滚动、持续动画、纯上传、纯下载。
- 同一时间窗导出 PerfDog CSV;文件至少含时间戳、AppCPU、TotalCPU、Send、Recv。
- 在同一设备重复三轮,记录 USB/Wi-Fi、刷新率、低电量模式和 PerfDog 客户端版本。
当前明确保持 Hold
- 没有 PerfDog CSV 时,不升级任何指标为 Validated。
- 没有前台证据时,不把 FPS/GPU 归因给目标 App。
- 没有 iOS 17+ 真机 route/隧道回包时,不宣称跨版本兼容。
- Network 继续只发布 device scope;进程归属尚未证明。
Next stage
后续顺序
- B-VAL:完成前台五场景 + PerfDog 三轮对照,决定 TotalCPU 展示口径。
- FRAME-1:确认逐帧 Display/Hitches 源,再实现 FrameTime、Drop、Jank 和 1% Low;没有逐帧源就保持 Unsupported。
- SHOT-1:接入低频截图与统一时钟,截图默认关闭并记录开销。
- C:在 P0–P2 稳定后再接 Energy/Thermal、云端上传和 Web 报告。