requests.fyi Performance

Daily benchmark/6 languages × 8 tasks

Cloudflare Worker performance, across six languages.

Cross-language latency benchmarks for Cloudflare Workers: JavaScript, TypeScript, Python, Rust, Go (TinyGo), and C++ (Emscripten), measured daily across eight task categories.

01 — Latency heatmap

Mean latency, language by task.

Mean end-to-end latency in milliseconds for each language × category combination. Green is faster, red is slower, on a log scale so the fast cells stay distinguishable from Python. Toggle between warm requests and each run's cold first hit, or hide Python to rescale the colours across the remaining languages.

Warm · mean ms · log scale
Hover a cell for time to first byte, range, sample count, run, and data center.

02 — Language leaderboard

Warm latency, fastest first.

Mean warm latency across all categories (square), with the observed min–max range across the category matrix (bar). Shorter is faster.

Mean Min–max across tasks Warm · ms

03 — Cold-start penalty

What the first request costs.

How much slower each run's first request to a worker is than the warm requests that follow it. By language shows the median across the eight categories; switch to see every worker.

Warm Cold first hit
Sorted by penalty, largest first. Δ is the cold first hit minus the warm mean.

04 — By category

Every task, side by side.

Per-category small multiples: warm latency per language, sorted fastest first. The dashed orange line is the per-category median across languages.

05 — Methodology

How to read this.

01

Measured inside Cloudflare's network

Once a day a cron trigger on the driver worker calls each benchmark worker in turn with fetch(). Latencies are the driver's view of those subrequests, measured in whichever data center ran the cron (shown above), so they exclude the public internet hop. Smaller is faster.

02

Cold first hit

The first request a run sends to each worker. With about 24 hours since the previous run, that request usually has to load the script in that data center and start a fresh isolate. It is not a post-deploy measurement, and a real visitor in the same location could occasionally have warmed the worker first.

03

Warm

The mean of the requests that follow (five per run), which reuse the isolate the first hit started.

04

No in-worker timings

Workers freeze performance.now() until the next I/O as a Spectre mitigation, so in-worker timers read 0 for CPU-only work. Cloudflare's Server-Timing: cfReqDur is only sent to external clients, not to Worker subrequests, so neither appears here.

05

Small samples, moving data centers

Sample sizes are small by design, and the cron's data center changes from day to day. Use the range bars to gauge noise, not just the means.

06

Runtimes

Python runs on Pyodide, and Rust, Go, and C++ run as Wasm inside the JavaScript runtime. Raw "hello" is the cleanest view of runtime overhead.