Skip to content
ZeroServer.tools

Stopwatch

Start, stop, reset, and record laps — millisecond precision, all in your browser.

Mode:
00:00.00

About this stopwatch

This browser-based stopwatch uses requestAnimationFrame for smooth millisecond-precision display. Lap times show both the split (time since last lap) and cumulative total. The stopwatch runs entirely in your browser — no data is sent anywhere, and it works offline. Reloading the page resets the timer.

Built and maintained by Meet Shah · Last updated

What this tool is used for

  • Timing a manual process to find out how long it really takes.
  • Recording lap times for repeated attempts at the same task.
  • Timing a build or a deploy when the tooling does not report it.
  • Measuring an interval during a demo or a test.
  • Comparing two approaches by timing both.

Frequently Asked Questions

How accurate is a browser stopwatch?
Good to a few milliseconds, using performance.now() — a monotonic clock that is immune to system time changes. Date.now() is wrong for timing because an NTP correction or a DST change can make it jump backwards.
Why do timers drift in a background tab?
Browsers throttle setInterval in inactive tabs — often to once per second or less — to save battery. Counting ticks therefore loses time; computing elapsed time from a start timestamp does not, and stays correct across throttling.
What is the difference between lap and split times?
A split is the total elapsed at that point; a lap is the time since the previous mark. Four 60-second laps give splits of 1:00, 2:00, 3:00, 4:00. Confusing them is why reported race times sometimes look impossible.
Why is timer resolution deliberately reduced?
Because high-resolution timers enabled Spectre-class side-channel attacks. Browsers now coarsen performance.now() and add jitter, which is why sub-millisecond precision is not available and should not be relied on.
Does it keep time if I close the tab?
No — state lives in the page. A refresh or close ends it unless the elapsed time was persisted. This is a genuine limitation of browser tools compared with a native app that can run in the background.
Why measure elapsed time from a timestamp rather than by counting?
Because a timer that fires late loses the difference permanently, and the errors accumulate. Recording a start time and subtracting means a delayed frame shows the correct elapsed time on the next one.
Which clock should be used?
A monotonic one such as `performance.now()`, because the wall clock can jump backwards when the system syncs time or crosses a daylight-saving boundary — producing a negative elapsed time on an otherwise normal run.
How precise is the displayed value really?
Browsers deliberately coarsen high-resolution timestamps to limit timing side-channel attacks, so hundredths are honest and finer digits are not. Displaying milliseconds implies a precision the platform does not offer.

Common errors and gotchas

  • Trusting millisecond precision for a human-started measurement, where reaction time dominates the error.
  • Leaving the page in a background tab, where timers may be throttled by the browser.
  • Losing the recorded laps by navigating away, since they are held in the page.
  • Using it to benchmark code, where a proper profiler measures what actually matters.
  • Comparing timings taken under different conditions as if they were controlled.

Related Developer Utilities tools

Private & free — this tool runs entirely in your browser.

IndieKitShip your Next.js startup in days.affiliate