Tools/Mouse Tests

Mouse Latency Test

Measure how soon the page receives each click, how evenly movement events arrive, and compare two mice. Not switch debounce, USB or wireless hop time.

Recording into
clicks - · move -
clicks - · move -

Pick a run, connect that mouse (or switch its mode), then do both tests. Switch to the other run and repeat with the second mouse or connection.

1. Click trials

0/20

Click here 20 times

2. Movement jitter

5.0 s

Press Start, then move in steady circles here

Results: Wired (run A)

Click delivery

No click trial for this run yet.

Movement event stream

No movement test for this run yet.

A/B comparison

Record at least one test into run A and one into run B to see them side by side. Results are saved in this browser.

What this test can't measure

A web page only sees an event after the OS has it. Switch debounce, sensor processing, the wireless hop and the USB transfer all happen before that timestamp, so they are invisible here. For absolute click to screen numbers you need a light sensor rig like NVIDIA LDAT or a slow motion phone camera, as in the input lag test. What this page gives you is a fair relative comparison of report rate, jitter and browser delivery.

About mouse latency

Where mouse latency comes from

A click passes through the switch, the mouse controller, a cable or radio and the operating system before this page can see it. Those stages are already done when the browser writes the event timeStamp, so the numbers here do not include them. Click delivery is performance.now() minus that stamp, taken in the pointerdown handler. To next frame is performance.now() minus the same stamp inside the next animation frame. Movement rate comes from gaps between pointer event stamps.

Reading your numbers

Click delivery of a couple of milliseconds is common on a desktop browser, because it is the handoff into the page. To next frame also waits for an animation frame, so a 60 Hz screen reads higher than a 144 Hz screen. For movement, an average gap near 1 ms with a tight histogram means events are arriving near 1000 Hz. That shows up with pointerrawupdate or coalesced events. Plain pointermove usually follows the refresh rate instead. A slow, lumpy stream can come from a low polling setting or from Bluetooth, but the radio time itself is not in the stamp. Run each mouse two or three times: single passes vary with how steadily you move.

"Lag-free wireless": true or BS?

A lab test of the whole path is what can put a 2.4 GHz gaming link next to wired. This page cannot. It only compares the event stream after the operating system stamp. Bluetooth often shows a slower, less even stream here, which fits a low report rate, and the radio time is still missing. If a box says lag free, it is naming a hop this page does not time. Use the A/B table for report rate and jitter, not for a hardware millisecond.

How to reduce it

Set the polling rate to 1000 Hz or higher in the vendor software and confirm it with the mouse polling rate test. Plug the dongle into a rear port or use the extension cable so it sits close to the mouse, away from USB 3 ports and Wi-Fi routers. Use the 2.4 GHz mode, not Bluetooth, for games. Lower the debounce time if the software allows it, but watch for chatter with the double click test.

FAQ

Frequently asked questions

What does this mouse latency test measure?

Two clocks the browser already has. On each pointerdown, click delivery is performance.now() minus the event timeStamp: how long this page waited to run the handler after the browser stamped the event. A requestAnimationFrame callback then records performance.now() minus that same timeStamp, which is the wait until the next frame callback. Movement mode records gaps between pointer event timeStamps. The report rate is 1000 divided by the mean gap in milliseconds. None of these clocks start at the mouse switch.

Can it measure switch debounce, USB, or wireless delay?

No. Debounce, the sensor, the radio hop and the USB transfer all finish before the operating system stamps the event. That earlier time is not in the timeStamp, so this page cannot isolate it or print a hardware millisecond for it. A light sensor rig or a high speed camera can time click to photons. This page cannot.

Is the click number my reaction time?

No. Nothing here waits for a signal and then times your hand. You click whenever you want. The pad records the event stamp, the handler and the next animation frame. No human time is subtracted from the result.

Why is one press only one sample?

The pad listens for pointerdown only. It does not also listen for click, so the click event that follows a press is not a second sample. A time of 0 ms is dropped. A negative difference between performance.now() and timeStamp is dropped too, because a delay cannot run backwards. If nothing positive remains, the run says so instead of showing 0 ms.

How is movement jitter counted?

Press Start, then move inside the pad. The timer starts on the first movement and runs for 5 seconds. The page prefers pointerrawupdate. If that event never arrives, it uses getCoalescedEvents on pointermove. If those samples are missing, it uses plain pointermove, which follows the screen refresh rate. Gaps of 50 ms or more are treated as pauses and left out. Fewer than 50 gaps does not produce a result. The hertz figure is only the event stream this page received, not a USB descriptor.

What does the A/B table compare?

Run A and run B store the clicks or movement you recorded into each slot. The table puts those browser numbers side by side. Report rate and jitter can differ when one mouse sends events more often or less evenly. Click delivery usually follows the browser and the PC, not the radio. If one average gap is longer, half of that difference is an estimated extra wait for the next report. That line is an estimate from the intervals, not a measured switch-to-USB time.

Why do I see a dash instead of 0 ms?

A dash means there is no usable sample yet, or the sample was not a positive time. 0 ms would look like a measured delay. Spread is shown as 0 only when two or more real samples were identical. Leaving the page clears the pointer listeners, the animation frames and the movement timers.