Latency Lab

Workers · Durable Objects · DynamoDB · Cache · R2 — reads
Not connected
You – Ingress – Worker –
Paste the lab token and connect.

Route

Where each hop ran on the last run, and how the lab knows.

Connect to see where your requests land.

Results

Per request of 10 items, timed in the worker. End-to-end adds the browser ↔ edge hop.

Live trace

Every sample, log scale. Paths take turns each iteration in a random order. Shaded points are warm-up.

Where the time goes

Median request, split into network round trips and everything else at the far end.

Browser ↔ edge Network to the data (probe RTT × round trips) Processing and queuing

How each number is measured

End-to-end
Browser performance.now() around each /api/run call. Samples run one at a time.
Worker time
Worker Date.now() around the batch, in whole milliseconds. The clock only moves on I/O, which is what each read is.
Network
Median of 7 no-op probes taken before the run: GetItem of a missing key, DO ping(), cache miss, R2 head of a missing key. Multiplied by the round trips the pattern needs at best.
Processing
Worker time minus network. It includes queuing when the platform runs fewer calls at once than were asked for.
Inside the DO
The DO's cpuTimeMs from Workers Logs, joined on a log line the DO writes. It arrives 10–60 s after the run.
Locations
request.cf.colo for ingress; /cdn-cgi/trace fetched from inside the worker and the DO for where each actually runs; the cf-placement header; configured region for DynamoDB and R2.
Cache API. The cache is per colo. A miss is filled after the response, so warm-up iterations fill it; the Results table shows the hit rate.

Run history

p50 worker time per path. Click a row to load its settings.