使用方法
- 点一下上面的色块,或者直接按 空格,本轮开始。色块变红并显示「准备…」,此时不要出手。
- 色块由红变绿的瞬间立刻点击色块(或再按空格)。绿出现到出手之间的毫秒数会被记进「用时」一栏,然后自动进入下一次。
- 默认测 5 次。全部做完后统计卡给出中位数、平均值、最快、最慢与首次成绩,判定行同时给出与人类常见区间 180~250 ms 的对比。
- 次数与随机延时都可以改:三个输入框允许 3~20 次、下限 500~3000 ms、上限 1000~8000 ms,填好按 Enter 立即校验并应用,数值不合法会指出是哪个框、允许什么范围。
- 成绩表默认显示前 12 行,次数超过 12 时点「加载更多」展开;「复制成绩」按 TSV 复制,「导出 CSV」下载带 BOM 的文件,Excel 打开中文不乱码。
- 页面预置的这份成绩只是排版演示(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。照着算一遍:
- 有效次数 4(首次 412.0 ms 被剔除);
- 升序排列后是 233、241、255、268,样本数为偶数,中位数取中间两个的平均:(241 + 255) ÷ 2 = 248.0 ms;
- 平均值 249.25 ms((268+241+255+233)÷4),比中位数高 1.25 ms;
- 最快 233.0 ms、最慢 268.0 ms,极差 35 ms;
- 样本标准差(除以 n−1)为 15.46 ms;
- 如果不剔除首次直接取中位数,得到的是 255.0 ms,比正确值高 7 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 ms | 1500 | 低于 500 ms 会来不及把注意力从上一轮切回来 |
| 随机延时上限 | 1000~8000 ms | 4500 | 超过 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% |
边界与精度说明
- 测的是端到端,不是纯神经速度。结果里包含显示延迟、浏览器主线程调度、输入设备轮询周期和你的肌肉动作。60 Hz 屏 + 125 Hz 鼠标的固定开销就在 10~25 ms 量级,所以浏览器里测出 190 ms 的人,未必比在专用设备上测出 210 ms 的人慢。
- 低于 100 ms 一律判预判。这是刻意的:即便顶级电竞选手,稳定低于 120 ms 的简单视觉反应也极少见。把它算进中位数只会让成绩虚高,所以本工具直接剔除并让你重测。
- 抢跑不占次数。信号出现前点击会被记为「抢跑」并列在成绩表里,但测试次数不推进,等于让你把这一次重新做一遍。连续抢跑说明你太想赢,先把节奏放慢。
- 只有 3 次时不剔除首次。剔除首次的前提是剩余样本 ≥ 3,否则中位数退化成两个数的平均,反而更不稳。此时统计卡在「首次」那一格会显示「—」,表格里所有有效成绩都标「计入统计」。
- 一天之内波动 20~30 ms 是正常的。睡眠、咖啡因、血糖、室内温度都会影响。想比较设备差异,请在相近的时间段、同样的姿势下各测 20 次再对比中位数。
- 标签页切到后台会暂停感知。浏览器会节流后台标签页的定时器,如果你在等待期间切走,信号实际早已变绿但你没看见,回来再点会得到一条几百毫秒甚至几秒的假数据——这类记录请在成绩表里识别出来后重测一整轮。
- 结果不落在任何键鼠驱动层。键盘固件去抖、无线键盘的省电唤醒都会额外增加十几毫秒的延迟,那是驱动与硬件在做的事,浏览器的
performance.now()看不到。
常见问题
为什么我的成绩比游戏里看到的低/高很多?
因为口径不同。游戏里显示的多是服务器往返时间或渲染帧时间,包含网络与显示链路;本工具测的是「色块变绿的代码执行时刻」到「浏览器收到点击事件时刻」。两者相差一帧显示延迟加一次输入轮询,通常在 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 的改善。真正决定成绩的还是注意力与出手时机的一致性。