Measurement
Timing
Every number is the median of dozens of timed GPU passes, with the visuals held still while they run.
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
- Calibrate. Grow the dispatch count by four until a pass reaches a quarter of the target, then scale to the target.
- Warm up. Unrecorded passes for up to 500 ms (at most a tenth of the budget) so clocks ramp.
- 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.
- Reject. Drop samples whose modified z-score, 0.6745 × |x − median| ÷ MAD, exceeds 3.5.
- Report. The median of what remains. Spread is the coefficient of variation.
| Budget | Read | Write | Copy | Random | Latency | Sustain |
|---|---|---|---|---|---|---|
| Full run | 6.5 s | 6.5 s | 6.5 s | 4.5 s | 3 s | 18 s |
| Quick (development) | 1.6 s | 1.6 s | 1.6 s | 1.2 s | 0.9 s | 4 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.