Measurement

Timing

Every number is the median of dozens of timed GPU passes, with the visuals held still while they run.

WorkerGPUPagepass: reps dispatches, about 40 mssubmittimestamps read backsample, ackId n1 frameack nwait 2 ms, next pass
Sample-locked rendering. The page draws exactly one frame between passes; decorative GPU work never overlaps a measured one.

Samples

A sample is one compute pass holding enough dispatches for about 40 ms of GPU work. Bytes per sample divided by its duration gives one throughput reading. Each phase collects dozens to hundreds of them.

Clocks

GPU timestamps
With the timestamp-query feature, the pass writes timestamps at its start and end, resolved and read back after it completes. Chrome quantizes them to 100 µs, 0.25 % of a 40 ms sample. A reading that is negative or longer than the wall-clock round trip is discarded.
Wall clock
Without timestamps, samples grow to about 80 ms and are timed from submit to completion, minus the median cost of an empty submit measured at start-up. The result records which clock was used.

Per phase

  1. Calibrate. Grow the dispatch count by four until a pass reaches a quarter of the target, then scale to the target.
  2. Warm up. Unrecorded passes for up to 500 ms (at most a tenth of the budget) so clocks ramp.
  3. Sample. Record passes until the budget is spent, at least eight, with a hard stop at 2.5 times the budget for very slow devices.
  4. Reject. Drop samples whose modified z-score, 0.6745 × |x − median| ÷ MAD, exceeds 3.5.
  5. Report. The median of what remains. Spread is the coefficient of variation.
BudgetReadWriteCopyRandomLatencySustain
Full run6.5 s6.5 s6.5 s4.5 s3 s18 s
Quick (development)1.6 s1.6 s1.6 s1.2 s0.9 s4 s

Phases are separated by 650 ms transitions. Budgets live in src/lib/bench/engine.ts.

Isolation

  • The engine runs in a dedicated worker, so React, GSAP and WebGL never delay a timing callback. Browsers without WebGPU in workers fall back to the main thread.
  • While a phase measures, the 3D render loop is stopped. After each sample the page renders exactly one frame, flushes it, and acknowledges with the sample id.
  • The worker waits for the matching acknowledgement (at most 120 ms, stale ids ignored), then 2 ms, then submits the next pass.
  • Transitions render at full frame rate while the GPU is idle.

On a GTX 1080 Ti, in-browser results land within about 1 % of the same kernels run headless through Dawn.

Failures

Out of memory
Buffers are allocated inside an error scope. The working set halves until it fits, down to 32 MiB; below that the run stops.
Device lost
Reported as device lost, including a loss during a timestamp readback.
Uncaptured GPU error
Aborts the run. A silently failing pass would otherwise poison the timings.
Cancel
Stops at the next check; nothing is submitted.

Limits

  • Browsers add bounds checks and scheduling overhead. Native tools usually read a few percent higher.
  • Other GPU work, such as video, games or another tab, lowers every phase.
  • Laptops on battery or in power-saving modes may run memory at lower clocks.
  • On unified-memory systems the CPU shares the same memory, so background CPU load counts too.
  • Integrated GPUs expose their system memory only indirectly, so their classes are marked variable. See Device classes.

To question a result, open it from The Stack and compare its phases with its class on the leaderboard.