Computers

Screen Refresh Rate

What your browser is actually presenting at
requestAnimationFrame
ready

Run the test

Keep this tab visible and in the foreground. Browsers throttle background tabs to about one frame a second, which the test will report as roughly 1 Hz rather than your monitor's rate.

Environment

Clock resolution
—
Device pixel ratio
—
Screen
—
—Hz
Press start. It takes a few seconds.

Results

—
Measured rate
—
robust estimate
Frame time
—
median interval
1% low
—
worst 1% of frames
Jitter
—
standard deviation
Frames
—
Long frames
—
Spread
—

Frame times

every interval, bucketed

Over the run

instantaneous rate
See it

Watch the number instead of reading it

—
Pattern
Row speed
Reference

Common refresh rates, and what a frame costs

RateFrame timeWhere you meet itvs 60 Hz
The gain from each step is smaller than the number suggests: going 60 → 120 Hz removes 8.3 ms per frame, while 240 → 480 Hz removes only 2.1 ms. Refresh rate is one term in the total delay between an input and a photon, alongside input polling, the game or compositor pipeline and the panel's own response — halving the frame time does not halve what you feel.
How it works

Counting frames, carefully

Counting frames

No browser API reports a monitor’s refresh rate. requestAnimationFrame runs once per presented frame, so timing enough of them gives the rate.

Median, not average

Some frames get missed and the clock is deliberately coarse. A plain average of the gaps gets both wrong at once; the median does not.

Dropped frames

Gaps more than 25% from the median are counted as drops and reported separately, not averaged into a rate the monitor never ran at.

Variable refresh

On G-Sync or FreeSync there may be no fixed number. When the spread is too wide to call, the page says variable rather than inventing an average.

Worked example. A 240 Hz panel dropping 3% of frames: the raw average interval works out at 4.31 ms, which reads as 232 Hz, a monitor nobody sells. Take the median, keep only the intervals within 25% of it, and divide the count by the elapsed time across them, and the answer comes back 240 Hz, with the dropped frames reported separately: the useful pair of facts.
Field notes

Reading the number honestly

This measures the browser, not the panel

What is timed is how often the browser presents a frame. On an idle page that equals the display’s refresh rate, but a busy machine, a power-saving profile or a browser that caps itself will all read lower than the monitor is capable of.

The clock is blunt on purpose

Browsers round performance.now() to defend against timing attacks, often to 100 µs, sometimes 1 ms. At 240 Hz a frame is 4.17 ms, so on a 1 ms clock every individual reading is 4 or 5 ms and never 4.17. Only the aggregate over many frames recovers it, which is why this page will not show a live per-frame number.

Each step buys less than the last

60 Hz16.7 ms
120 Hz8.3 ms
240 Hz4.2 ms
480 Hz2.1 ms

Frame time is the reciprocal of refresh rate: 60 to 120 Hz saves 8.3 ms a frame, 240 to 480 Hz only 2.1 ms.

Dropped frames are not a slow display

Miss a vsync and the interval doubles. Averaging those in reports a rate the monitor never ran at: a 240 Hz panel with 3% drops averages out near 232 Hz. The estimate here uses the median and discards the outliers, then counts them separately.

Questions

What people ask

Why does it say 60 Hz when I have a 144 Hz monitor?

Usually the browser window is on a different display, the machine is on a power-saving profile, or the browser is capping itself — some do on battery. It can also happen if the page is not the active tab. Try again with the window on the fast display and the laptop plugged in.

Can it really measure 500 Hz?

Yes, provided the browser is genuinely presenting that fast. The estimator works from total elapsed time across hundreds of frames rather than individual gaps, so a coarse clock averages out. What it cannot do is exceed what the browser presents — if the browser caps at 60, no measurement will find the panel's 500.

What is the 1% low?

The rate corresponding to the slowest 1% of frames. A high average with a poor 1% low is what stutter feels like: the mean says smooth, the occasional long frame is what you actually notice.

Should I run it for longer?

Longer samples make the estimate steadier and are much better at catching occasional hitches — a 2-second run can easily miss a stutter that happens every ten seconds. For simply identifying the rate, 2 seconds is plenty at any refresh rate above 60 Hz.

What this page assumes

That requestAnimationFrame fires once per presented frame, which is true in current browsers but is a browser behaviour rather than a guarantee. It measures the presentation rate of this page, not the display's capability: a browser that caps its frame rate, a background or occluded tab, a power-saving profile or a busy GPU will all read lower than the panel can do, and the tool cannot distinguish those from a genuinely slower monitor. Timestamps are quantised by the browser for security, so results are aggregates over many frames rather than per-frame measurements. On a variable-refresh display there may be no single correct answer to report. No result here should be taken as a hardware specification. The visualiser below is a corroboration, not a second measurement: the stutter ladder is driven by the same estimate, and what it shows is bounded by the same limits — on a variable-refresh display, or where the browser is throttling, it will agree with the number for the same wrong reason. Rows at or above your rate are all showing the same thing — your display's native motion, which is the best it can do — so they are identical by construction rather than by coincidence. Tearing is simulated for illustration and cannot tell you whether your own setup tears, since that is decided by vsync well below the browser.

Measures this browser, not your monitor. A capped browser, a background tab or a power-saving profile all read lower than the panel is capable of.
Version history · 2 releases
  1. v3.02026-08-10A motion visualiser on the refresh-rate page — a stutter ladder that lets you confirm the measured number with your own eyes, plus pursuit and tearing patterns
  2. v3.12026-08-10The ladder rows above your refresh rate now match, because they should have all along; a second speed mode, a 1 Hz floor, and pursuit lanes at different rates

Releases in which this page changed, newest last. Derived from the archived copy of every release, not from notes written afterwards — so it reflects what actually shipped. Site-wide passes are left out; they are in the full changelog.

Rules of thumb are approximations, offered to get you to the right order of magnitude fast. Check anything load-bearing against its source or the exact tool. Privacy · Terms

© 2026 Rules of Thumb · Runs entirely in your browser