Skip to content

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 分钟)。两场不是同一时间窗,只比较分布形状,不做同窗数值对等。

方法 ​

  1. 把 PerfDog 的逐帧帧耗时原样喂给 Perfowl 的 analyze_display_frames,和 PerfDog 自己的汇总值对比(同输入比公式)。
  2. 用 PerfDog 逐秒 FPS 列复算它的 FPS 类汇总,确认其口径。
  3. 对 Jank 类做假设检验:逐秒对齐并比较总数。

结果 ​

FPS 类:PerfDog 按“每秒 FPS 序列”计算,6 项全部精确复现 ​

指标PerfDog按每秒 FPS 复算
Avg(FPS)72.5672.56
Median(FPS)7575
Std / Var(FPS)31.24 / 976.0831.24 / 976.08(总体方差)
FPS≥18 / ≥25 [%]97.9 / 91.797.9 / 91.7
MedRange(FPS)[%]25.025.0(中位 ±20% 内的秒数占比)
Drop(FPS)[/h]1225.51225.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) 的映射此前未闭合,本次确定为上式。

逐帧类:大部分吻合 ​

指标PerfDogPerfowl 算法(同一帧序列)
1% Low(FPS)3.823.82
Avg(FTime) / Std(FTime)13.78 / 30.5813.73 / 30.75(起点窗口差异)
FTime≥100 [%]0.90.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 ms2.6%2.6%
≥83.33 ms1.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 口径;两工具同一时间窗对照。

Perfowl · Performance Observer