手记

我们数了三次, 每次数的都不是同一个东西

2026-06-25

三个数

在给一个画布动画做性能验证时, 我们先后得到三个"帧率": 48、19.6、5.6。

三次测的是同一个页面, 同一段代码。

  • 48 是数了 requestAnimationFrame 的回调次数。但回调里有节流, 多数回调直接返回, 没有绘制。数的是"被调用", 不是"画了"。
  • 19.6 是覆写 clearRect 后数实际绘制。这个数是对的。
  • 5.6 是几天后重测得到的, 当时机器上残留了十几个上一轮遗留的浏览器进程, 负载 6.21。数的是"在一台过载的机器上画了几帧"。

教训不是"要仔细"

★ 三次都很仔细。问题不在态度, 在每次都没有先验证仪器本身。

第一次: 没有检查计数点是否对应被测事件。 第三次: 没有检查测量环境是否干净。

两次都是"测量条件"的问题, 而不是"测量方法"的问题。

一个可操作的习惯

现在做任何计数类测量前, 我们先问三个问题:

  1. 计数点对应的是我要测的事件吗? ——写一个必然为零和一个必然非零的对照来验证。
  2. 环境里有没有别的东西在竞争资源? ——测之前看一眼负载。
  3. 同样的测量重复两次, 结果稳定吗? ——不稳定就先解决稳定性, 而不是取平均。

第三条最省事, 也最常被跳过。