外观
PerfDog 帧统计口径对照
输入
- Owner 提供 PerfDog 13.0 导出(设备 A,iOS 26,目标 App A,持续滑动约 48 秒)。导出含逐帧
@FrameInfo(3,483 帧,其中时间 ≥ 0 的 3,440 帧)、逐秒数据 48 行与汇总 Stat。原件含设备名与 Bundle ID,只存私有目录,不进仓库。 - Perfowl 239 同设备、同 App 的约 104 秒滑动会话(15:17,比 PerfDog 那场早约 6 分钟)。两场不是同一时间窗,只比较分布形状,不做同窗数值对等。
方法
- 把 PerfDog 的逐帧帧耗时原样喂给 Perfowl 的
analyze_display_frames,和 PerfDog 自己的汇总值对比(同输入比公式)。 - 用 PerfDog 逐秒 FPS 列复算它的 FPS 类汇总,确认其口径。
- 对 Jank 类做假设检验:逐秒对齐并比较总数。
结果
FPS 类:PerfDog 按“每秒 FPS 序列”计算,6 项全部精确复现
| 指标 | PerfDog | 按每秒 FPS 复算 |
|---|---|---|
| Avg(FPS) | 72.56 | 72.56 |
| Median(FPS) | 75 | 75 |
| Std / Var(FPS) | 31.24 / 976.08 | 31.24 / 976.08(总体方差) |
| FPS≥18 / ≥25 [%] | 97.9 / 91.7 | 97.9 / 91.7 |
| MedRange(FPS)[%] | 25.0 | 25.0(中位 ±20% 内的秒数占比) |
| Drop(FPS)[/h] | 1225.5 | 1225.5:相邻两秒 FPS 下降 > 8 的次数 16,除以 (48−1) 秒再 ×3600 |
Perfowl 帧报告(frame-report.json)这几项按逐帧计算(如中位 FPS 119.76、FPS≥25 97.56%、Drop 18,649/h),与 PerfDog 口径不同。产品 Excel/报告中的 1 Hz FPS 统计已按每秒序列计算(2026-10-28 记录),Drop(FPS) 的映射此前未闭合,本次确定为上式。
逐帧类:大部分吻合
| 指标 | PerfDog | Perfowl 算法(同一帧序列) |
|---|---|---|
| 1% Low(FPS) | 3.82 | 3.82 |
| Avg(FTime) / Std(FTime) | 13.78 / 30.58 | 13.73 / 30.75(起点窗口差异) |
| FTime≥100 [%] | 0.9 | 0.96 |
| Delta(FTime)>100ms [/h] | 1838.3(24 次 / 47 秒) | 1765.1(23 次 / 46.9 秒) |
Jank / BigJank:Perfowl 多算约 25%,原因已定位
- 现行 Perfowl:当前帧 > 前 3 帧均值 ×2 且 > 83.33 ms(BigJank 为 > 125 ms)→ 同一序列得 Jank 27、BigJank 25;PerfDog 为 21、19。
- 多出的帧都紧跟在另一次卡顿之后(前 3 帧里已有卡顿帧)。加入规则“前 3 帧中已有 Jank 帧时,本帧不再计为 Jank”后:Jank 21 = 21、BigJank 19 = 19;PerfDog 逐秒窗口相对帧时间约偏移 +0.76 秒,对齐后 48 秒中 44 秒逐秒完全一致。
- Stutter:PerfDog 13.09%。按“去重后的 Jank 帧耗时之和 ÷ 总时长”复算 13.02%;现行 Perfowl 公式(Jank 帧超出基线的部分之和)同序列为 13.88%。
未能复现
- TinyJank / SmallJank(PerfDog 66 / 59 次):试过 1000/24、1000/30、50 ms 阈值与 ×1.5/×2 倍数、是否去重,没有一组同时命中两者,口径仍未知。
- Smooth:PerfDog 27.8;Perfowl 现行为自定义稳定度候选(同序列 373.8),两者不是同一指标,不可比。
两场分布(不同时间窗,只看形状)
| 帧耗时区间 | PerfDog(3,440 帧) | Perfowl 239(9,372 个间隔) |
|---|---|---|
| ≈8.3 ms(120 Hz) | 60.0% | 88.8% |
| ≈12.5 ms(80 Hz) | 28.0% | 6.0% |
| ≈16.7 ms(60 Hz) | 8.3% | 2.3% |
| ≥33 ms | 2.6% | 2.6% |
| ≥83.33 ms | 1.0% | 0.8% |
两者都呈现 ProMotion 的离散档位(8.3 / 12.5 / 16.7 ms),说明 FrameUpdate 呈现间隔与 PerfDog 的帧耗时是同一类事实;档位占比不同与滑动力度、页面内容有关,不能据此判断谁对。
结论
- Perfowl 逐帧帧耗时的含义与 PerfDog 一致(E3,同设备离线复算)。
- 需要修正的口径:① Jank/BigJank 加“前 3 帧已有 Jank 不重复计”;② Stutter 改为 Jank 帧耗时之和 ÷ 总时长;③ 报告中 FPS 类统计统一按每秒 FPS 序列(含 Drop 映射)。这三项先改公式文档,再改 Python 与 Swift 两处实现。
- 10-24 各卡顿指标的“5/5 通过”当时标注为无参考对照(
referenceAccuracyValidated=false),本次是首次与 PerfDog 数值对照,结论按上文增量记录,历史数字不回改。 - 仍开放:TinyJank/SmallJank 与 Smooth 口径;两工具同一时间窗对照。