Skip to content
ReactionTimeChart

How We Measure

A reaction time from a browser is a measurement of you plus your equipment. This page sets out exactly what is timed, which clocks are read, and what the margin printed beside your score is calculated from.

Two timestamps, one clock

A round is the interval between two readings of the same monotonic clock. The first is the timestamp handed to the animation frame callback in which the stimulus was painted; the second is the timestamp the browser attached to your input event. Both come from the same high-resolution origin, so subtracting them is valid.

Neither of those is the obvious naive choice, and the difference matters. Reading the wall clock when the code decides to show the stimulus measures the moment of the decision, not the moment of the paint, and reading it again inside the event handler measures when the handler ran rather than when the input arrived. Both errors inflate the score, and both are avoidable.

Using the event's own timestamp is the more important of the two. A browser records it close to when the input reached it, well before your handler is scheduled, so a busy page or a slow frame no longer adds itself to your reaction time.

When a stimulus counts as visible

The frame the stimulus was painted in is the earliest defensible moment to start counting, and it is still early. Painting is not showing: the pixels are handed to the compositor and then to the panel, which lights them during its next refresh cycle. A 60Hz display therefore leaves a window of up to 16.7 milliseconds between the paint and the photons.

That window is measured rather than assumed. Before each test a short run of animation frames is timed and the median gap taken, which gives the refresh rate the browser is actually presenting at. The median is used because a single dropped frame would otherwise report a 120Hz display as 90Hz.

If the probe cannot get a clean reading — a throttled background tab, a very short test — the calculation falls back to 60Hz and the result says that it assumed it. A stated assumption is a smaller problem than a hidden one.

What the margin covers, and what it cannot

The margin is built from two terms. The display contributes half a refresh interval, because the true visible moment is somewhere inside one and the midpoint is the best estimate available. The input device contributes half its polling interval, on the same reasoning — around four milliseconds for a mouse or keyboard polled at the common rate, and more for a touchscreen.

The two are combined in quadrature rather than added. Adding them would assume both errors always fall the same way, which overstates the margin by roughly a third. Averaging several rounds then shrinks the random part by the square root of the number of rounds, which is why a five-round attempt carries a tighter margin than a single round.

What the margin does not cover is anything unobservable from a web page: the panel's own response time, compositor buffering, a wireless input device's radio delay, or the audio buffer on the sound test. Those add a systematic offset in one direction, which is reported separately as a bias figure rather than being folded into the margin as if it were noise.

Rounds that are thrown away, and why that is not cheating

A response that arrives before the stimulus is not a fast reaction, it is anticipation, and it is discarded. A response faster than about a hundred milliseconds is discarded too, because the visual pathway alone costs more than that and a quicker figure has to have come from a guess or a script.

Discarding is done at the round level and stated on screen, so an attempt never silently becomes an average of fewer rounds than it claims. The delay before each stimulus is randomised specifically to make anticipation unprofitable, since a fixed delay turns the test into a measure of rhythm.

The same threshold is applied to results before they enter a distribution. One scripted submission left in a sample would shift the percentile shown to every subsequent visitor, and the curve is the product here, so the floor protects everyone's number rather than policing one person's.

This is a measurement toy, not a medical or psychological test. No score here says anything about your health, attention or cognition, and it is not a screening tool of any kind.

Questions

Does this site have input lag?
Some is unavoidable in any browser test, and the point of this page is that ours is estimated and printed rather than hidden. Nothing is queued, no framework sits between the input and the timestamp, and the timestamp read is the one the browser attached to the event itself.
Why does my score change between a 60Hz and a 144Hz screen?
Because a slower panel spends longer waiting to show the stimulus, which adds several milliseconds to the measured figure without anything about you changing. The refresh rate measured on your device is shown with your result for that reason.
Can I compare my score here to a published study?
Only loosely. Laboratory studies use dedicated response hardware with characterised latency, and a browser figure includes your display and input device as well as you — a systematic addition of roughly ten to twenty milliseconds.
Why is a round sometimes discarded?
Because the response arrived before the stimulus, or faster than perception physically allows. Both would corrupt your average and, if recorded, the distribution shown to everybody else.

The other tests