Stopwatch

Start / stop / lap stopwatch with millisecond precision.

Open tool

Overview

The Stopwatch is a millisecond-precision timer with start, stop, lap, and reset controls. Press start to begin counting up from zero, lap to record split times without pausing the run, stop to freeze the display, and reset to clear everything back to zero. Lap times are listed below the main readout with their delta from the previous lap.

Useful for runners and swimmers timing intervals on a track or in a pool, cooks measuring multi-stage recipes, debate moderators tracking speaker time, photographers timing long exposures, and developers profiling a one-off operation that does not warrant a full benchmarking framework.

How it works

The running time is computed by subtracting a captured Performance.now() start instant from the current Performance.now() value on every animation frame. Because Performance.now() is a monotonic, high-resolution clock independent of the wall-clock time, the result is unaffected by NTP adjustments, daylight-saving transitions, or the user changing their system clock mid-run.

Lap times are stored in an ordered list of timestamps so each lap delta and the cumulative total can be recomputed on the fly. Sub-millisecond precision is theoretically available but cross-browser jitter limits practical accuracy to about one millisecond, which is the resolution shown.

Examples

Start at 00:00.000
Lap at  00:23.451  → Lap 1: 23.451 s
Lap at  00:47.102  → Lap 2: 23.651 s
Lap at  01:10.890  → Lap 3: 23.788 s
Stop at 01:30.000  → Total elapsed: 1m 30.000s

FAQ

How accurate is the timer?

About one millisecond. The underlying Performance.now() clock has microsecond resolution, but browser throttling, GC pauses, and animation-frame quantisation limit practical accuracy.

What happens if I leave the tab inactive?

The timer keeps running because the start instant is fixed and elapsed is computed on demand. The visible readout pauses while the tab is throttled, then snaps to the correct value when you return.

Does it persist across reloads?

The current run is held in memory only. Refreshing the page resets the stopwatch. If you need a persistent timer that survives a refresh, use the countdown timer or Pomodoro instead.

Can I export lap times?

Lap times appear in a list below the main readout that can be copied as text. For structured export, copy the list and paste into a spreadsheet — each lap is on its own line.

Why not use the system clock?

System clocks can drift, be adjusted by NTP, or jump around DST transitions. Performance.now() is a monotonic clock that only ever moves forward at a steady rate, which is exactly what a stopwatch needs.

Try Stopwatch

An unhandled error has occurred. Reload ×