反应时间测试

点一下开始,等色块由红变绿后立刻点击或按空格,用 performance.now() 记录这中间的毫秒数;每轮多测几次、剔除首次、取中位数,比看单次成绩可靠得多。

有效次数4
中位数248.0 ms
平均值249.25 ms
最快233.0 ms
最慢268.0 ms
首次412.0 ms(已剔除)

提示:信号变绿之后 100 ms 内出手会被判为预判并重测;信号没出现就点击算抢跑,同样不计入统计。三个输入框里按 Enter 可立刻校验并应用新参数。

第几次用时(ms)状态
1412.0首次(已剔除)
2268.0计入统计
3241.0计入统计
4255.0计入统计
5233.0计入统计

使用方法

  1. 点一下上面的色块,或者直接按 空格,本轮开始。色块变红并显示「准备…」,此时不要出手。
  2. 色块由红变绿的瞬间立刻点击色块(或再按空格)。绿出现到出手之间的毫秒数会被记进「用时」一栏,然后自动进入下一次。
  3. 默认测 5 次。全部做完后统计卡给出中位数、平均值、最快、最慢与首次成绩,判定行同时给出与人类常见区间 180~250 ms 的对比。
  4. 次数与随机延时都可以改:三个输入框允许 3~20 次、下限 500~3000 ms、上限 1000~8000 ms,填好按 Enter 立即校验并应用,数值不合法会指出是哪个框、允许什么范围。
  5. 成绩表默认显示前 12 行,次数超过 12 时点「加载更多」展开;「复制成绩」按 TSV 复制,「导出 CSV」下载带 BOM 的文件,Excel 打开中文不乱码。
  6. 页面预置的这份成绩只是排版演示(5 次、中位数 248.0 ms),点「清空成绩」可以把它抹掉,点「重置为默认示例」可以还原。

反应时间测试能解决什么问题

一是给自己一个可信的基线。单次反应时间波动极大,同一个人连着点十次可能从 190 ms 跳到 380 ms,只测一次得到的数字基本没有意义。本工具一轮测 3 到 20 次、剔除首次、再取中位数,得到的是一个能跨天比较的稳定值。

二是排查设备链路而不是玄学。换了显示器、换了鼠标、换了键盘,成绩差多少毫秒可以被量化:60 Hz 屏每帧 16.67 ms,144 Hz 屏每帧 6.94 ms,两者最坏情况就差了一帧;125 Hz 的办公鼠标一个报告周期 8 ms,1000 Hz 的游戏鼠标只有 1 ms。这些差异在单次测量里会被噪声淹掉,在中位数上则看得见。

三是识别「抢跑型」成绩。很多在线测试把抢跑也算进结果,于是有人靠预判刷出 80 ms 的假成绩。本工具把「信号没出现就点」记为抢跑、「变绿后 100 ms 内出手」判为预判,两者都不计入中位数。

四是做疲劳与状态的对照。把一轮 20 次拆成「前 10 次 / 后 10 次」对比,熬夜、咖啡因、连续工作后的反应变化比主观感觉清楚得多。

这个反应时间测试不做这些事:不测手速与点击频率(那是点击速度测试的活)、不测识别与判断(这里没有干扰项,只测最简单的看见即反应)、不测肌肉极限,也不评估视力。

原理和变量:performance.now()、随机延时与中位数

计时的全部代码只有两行:信号变色的一刻调用一次 performance.now() 存进变量,你出手的一刻再调一次做减法。下面七条是这个反应时间测试的机制。

① 为什么用 performance.now() 而不是 Date.now()。前者返回 DOMHighResTimeStamp,是相对于页面时间原点的毫秒浮点数,W3C 的 HR-Time 规范要求它单调递增、不随系统时钟回拨;后者返回 Unix 毫秒整数,粒度就是 1 ms,而且一旦系统对时(NTP 校时、手动改时间)就会整段跳变,测出来的差值可能是负数。做毫秒级测量只能用前者。

② 精度上限不是 1 ms。为防止侧信道攻击,主流浏览器会把 performance.now() 的返回值量化:常见的实现把精度限制在 0.1 ms 左右(Chrome、Edge),部分 Firefox 配置下会粗化到 1 ms 甚至更高,只有开启了跨源隔离(同时发送 COOP 与 COEP 响应头)的页面才放宽到 5 µs。量化步长 0.1 ms 时,对 250 ms 量级的结果相对误差上限只有 0.04%;即便粗化到 1 ms,也只到 0.4%,不影响结论。

③ 随机延时是为了打掉预期。如果每次都固定等 2 秒,练几轮之后你完全可以靠数秒提前出手,成绩会虚高几十甚至上百毫秒。本工具在 [下限, 上限] 区间里取均匀随机值,默认 [1500, 4500] ms、宽度 3000 ms;离散到 100 ms 一档是 31 档,盲猜命中的概率约 3.23%,远低于固定延时下几乎必然的提前出手。

④ 中位数而不是平均值。平均值对离群值毫无抵抗力:示例的 5 次原始用时是 412、268、241、255、233 ms,直接算平均是 281.8 ms;如果把首次的 412 ms 换成走神时按出的 5000 ms,平均值会飙到 1199.4 ms,而中位数始终是 255 ms。中位数只看排序后的位置,一两个异常值顶多挪动一位。

⑤ 为什么要剔除首次。第一次不是能力问题而是流程问题:你还没建立「变绿」与「出手」之间的映射,手指也不在待命位置,实测普遍偏慢 100 ms 以上。示例里首次 412 ms 比其余四次的中位数高出 164 ms,就是典型的热身效应。本工具在有效样本 ≥ 4 次时剔除首次,剩余样本正好 ≥ 3 个,中位数才有意义;只有 3 次时不剔除并在结果里说明。

⑥ 中位数怎么算。把计入统计的样本升序排列后取中间位置:样本数为奇数时取正中那个,为偶数时取中间两个的算术平均。示例剔除首次后剩 233、241、255、268 四个样本,中位数就是 (241 + 255) ÷ 2 = 248.0 ms。这也解释了为什么默认 5 次而不是 6 次——剔除首次后剩 4 个,偶数样本的中位数是两次测量的平均,比奇数样本更抗单次抖动。

⑦ 抢跑与预判的判定线。信号出现前出手记「抢跑」,直接重测且不占次数;变绿后 100 ms 内出手判「预判」,同样不计入统计。100 ms 这条线不是拍脑袋定的:视觉信号要经过视网膜→外侧膝状体→初级视皮层→运动皮层再下达手部指令,这一整套的最小延迟就在 100 ms 量级,人类简单视觉反应时间的常见区间是 180~250 ms,低于 100 ms 基本只能解释为提前计划好的动作。

完整示例(数值仅作演示)

页面预置的这份成绩与正文、统计卡三处咬合:5 次测试、原始用时 412 / 268 / 241 / 255 / 233 ms、随机延时区间 1500~4500 ms。照着算一遍:

再换一个角度看中位数的稳健性:把首次那 412 ms 想象成一次走神按出的 5000 ms,计入平均会把平均值拉到 1199.4 ms,而中位数仍是 255 ms;剔除首次之后,两种情况下都是 249.25 ms 与 248.0 ms,一点没变。

导出成 CSV 时长这样(列顺序 第几次 / 用时(ms)/ 状态):

第几次,用时(ms),状态
1,412.0,首次(已剔除)
2,268.0,计入统计
3,241.0,计入统计
4,255.0,计入统计
5,233.0,计入统计

输入范围与对照表

三个输入框都有明确的取值范围,越界会指名报错,不会静默取默认值:

参数范围默认为什么是这个范围
测试次数3~20 次5少于 3 次取中位数没有意义;多于 20 次后段会因疲劳整体漂移
随机延时下限500~3000 ms1500低于 500 ms 会来不及把注意力从上一轮切回来
随机延时上限1000~8000 ms4500超过 8 秒注意力会漂移,盯屏幕本身变成负担

下表是不同硬件与刷新率带来的固定延迟,它们构成浏览器内测量的下限——换设备前先看这一列:

环节典型值对结果的影响
60 Hz 显示器1 帧 = 16.67 ms从变绿到你看清,平均要等半帧到一帧
120 Hz 显示器1 帧 = 8.33 ms比 60 Hz 少约半帧的显示延迟
144 Hz 显示器1 帧 = 6.94 ms与 60 Hz 的差距约 10 ms
125 Hz 鼠标轮询1 个报告周期 = 8 ms办公鼠标的点击到主机最多再差 8 ms
1000 Hz 鼠标轮询1 个报告周期 = 1 ms游戏鼠标把这一环压到 1 ms
performance.now() 量化约 0.1 ms对 250 ms 结果相对误差上限 0.04%

边界与精度说明

常见问题

为什么我的成绩比游戏里看到的低/高很多?

因为口径不同。游戏里显示的多是服务器往返时间或渲染帧时间,包含网络与显示链路;本工具测的是「色块变绿的代码执行时刻」到「浏览器收到点击事件时刻」。两者相差一帧显示延迟加一次输入轮询,通常在 10~25 ms。要比就只跟本页自己的中位数比。

为什么第一次总是特别慢?

首次属于热身:手还没放在待命位置,注意力也还没锁定到色块上,还要建立「变绿 → 出手」的动作映射,实测普遍慢 100 ms 以上。示例里的首次是 412 ms,比其余四次的中位数 248.0 ms 高 164 ms。所以样本够多时本工具会自动把它剔除。

中位数和平均值差多少算正常?

示例里中位数 248.0 ms、平均值 249.25 ms,只差 1.25 ms,说明样本比较干净。如果两者差出 30 ms 以上,通常意味着存在明显的离群值(走神、切窗口、系统卡顿),此时以中位数为准,并考虑把那一轮重做。

为什么要用随机延时,固定 2 秒不行吗?

固定延时练几轮后就可以靠数秒提前出手,把反应变成预判,成绩能虚高几十到上百毫秒。默认在 1500~4500 ms 之间均匀取值、离散到 100 ms 一档共 31 档,盲猜命中的概率约 3.23%,让预判没有收益。

信号还没出现我就点了,会怎样?

会被记为「抢跑」并写进成绩表,但不计入统计,测试次数也不推进——也就是说这一次要重做。这是刻意的:抢跑数据如果算数,成绩就变成了「谁更敢猜」。

测试次数设成 20 次会不会更准?

会更稳,但边际收益递减。样本标准差约 15.5 ms 时,中位数的标准误约为 1.253×σ/√n:3 次约 11.21 ms、4 次约 9.71 ms、9 次约 6.47 ms、19 次约 4.46 ms。把次数从 4 提到 19,精度只改善一倍多,时间却多了四倍,而且后段疲劳会让数据整体漂移。

可以用键盘代替鼠标吗?

可以,按空格和点击色块都能触发。两者测的是不同肌群:空格用的是拇指与更短的按键行程,通常比抬手腕点击鼠标快 10~30 ms;手写笔与触控屏则普遍更慢。想横向比较,请在同一轮测试里始终用同一种方式。

换高刷新率显示器能让成绩变好吗?

能,但幅度有限且只影响显示环节。60 Hz 每帧 16.67 ms、144 Hz 每帧 6.94 ms,最坏情况相差约一帧(10 ms 上下),中位数上通常体现为 3~8 ms 的改善。真正决定成绩的还是注意力与出手时机的一致性。

相关工具