Comparison
Measurements and limits
Recorded Workers results, the workload behind each number, and the failures that keep these from being unlimited-capacity claims.
Recorded probes on Workers Paid, not measurements made by this website. The latest check used build 8cddcbd and the published workflow 5.5.0 on 2026-11-14/15. Runs were unencrypted. The latest epoch had 256 store, 512 queue and 16 index shards; state and load generation requested enam. A hint does not prove colocation or residency.
Latest regression check
Typecheck and strict-unused checks passed. Unit tests passed 325, with 7 skipped. E2E passed 171, with 31 expected failures and 3 skipped. Deployed smoke and focused review found no new confirmed correctness regression.
A paired local writer benchmark did find overhead: 750 full step lifecycles averaged 144.34 ms with the old writer and 195.53 ms with the current one, about 35% more. There are five extra SQL calls per ordinary event. This isolates local writer work, not deployed end-to-end speed. Safety checks were not removed.
A large due hook-intent recovery backlog still has no measured safe burst size. No finite test here establishes universal capacity or proves every failure mode absent.
Creation is not completion
| Sample | Recorded result | Scope of verification |
|---|---|---|
| 100k, 8cddcbd | 5,082 creations/s; p50 107 ms, p95 397 ms; no creation errors. | All 100,000 outputs verified in 89.1 s, about 1,123 verified/s. Server completion span was 87.6 s. |
| Paced 60k, 8cddcbd | Nominal 2,000/s; actual 1,652/s; 25 HTTP 503s. | All 59,975 returned run IDs completed correctly. No output claim for calls that returned no ID. |
| Paced 90k, 8cddcbd | Nominal 3,000/s; actual 2,277/s; no creation errors. | All outputs verified in 82.8 s. Short paced jobs, not an hours-long steady-load study. |
| 100k, 4ceac87 | 4,220 creations/s; p50 93 ms, p95 237 ms; no creation errors. | Historical admission sample. Every final output was not individually verified. |
| 20k, f348a97 | 3,574/s; 19,998 accepted and completed, zero wrong outputs. | Two retryable 503s during a queue-object reset. |
| 20k rerun, f348a97 | 2,430/s; all 20,000 completed with correct output. | No creation errors in this sample. |
| 50k, f348a97 | 4,036/s; no creation errors; drained in about 3.3 minutes. | No failed runs observed. Not every output independently checked. |
Execution results
| Probe | Recorded result | Build |
|---|---|---|
| Current QuickJS fan-out | 30k parallel steps in 269.4 s; 35k produced executor exceededMemory. | 8cddcbd; higher-count probe guard temporarily raised |
| Current native fan-out | 2.5k in 28.5 s; 3k produced executor exceededMemory. | 8cddcbd |
| Byte-stream read | 1.75 GiB in 188.4 s, every byte correct; 2 GiB exceeded memory. | 8cddcbd; 16 MiB producer chunks |
| QuickJS fan-out | 1k / 5k / 10k parallel steps in 12.5 / 41.3 / 72.7 seconds. | f348a97 |
| Native fan-out | 1k in 6.2 seconds. Six 2k samples ranged from 20 to 32 seconds. | f348a97 |
| Spec-9 fan-out | 1k parallel steps in 8.5 to 10.6 seconds. | f348a97 |
| Long QuickJS run | 30k sequential steps, 90,003 events, 3,896 seconds. | adff891 |
| Replay gap after 10k | 185 ms QuickJS; 3.9 seconds native. Event timestamp gap, not VM CPU. | adff891 |
| 1 GiB stream, 32 MiB chunks | Every byte correct. Reading-step throughput 14 MiB/s QuickJS, 15 MiB/s native. | f348a97 |
In the 10k fan-out sample, 17 steps started twice. In two of six native 2k samples, larger batches restarted without an explanatory error in the captured tail. All finished correctly. The cause was not established; at-least-once delivery is visible here, not theoretical.
Limits are not all the same kind of number
| Quantity | Vercel published | Our measured or enforced value |
|---|---|---|
| Creations | 1,000/s. | 5,082/s in a 100k burst; absolute sustained maximum unknown. |
| Steps per run | 10k for Node; exempt with QuickJS snapshots enabled. | 30k sequential steps demonstrated, QuickJS. |
| Events per run | 25k for Node; same QuickJS exemption. | 90,003 demonstrated; no World-configured cap, but finite memory/throughput. |
| Payload | 50 MB. | 18 MiB serialized cap; 18,790,000 raw output bytes demonstrated. |
| Stream chunk | 10 MB documented. | 32 MiB encoded chunk cap. MB and MiB differ. |
| Replay | 240-second budget. | Same SDK timeout class; 185 ms is one measured gap, not a replacement budget. |
Known failure points
- 35k QuickJS parallel steps: executor exceededMemory at 8cddcbd. A 30k run passed. The historical 20k failure is not a current fixed ceiling.
- 3k native parallel steps: executor exceededMemory; 2.5k passed. Core replay memory grows quadratically.
- 2 GiB in one QuickJS reading step: exceededMemory with 16 MiB producer chunks; 1.75 GiB passed.
- Very large values: producer or consumer code can exhaust memory before a clean 413 is possible.
- Regional distance: sequential RPC latency can dominate small steps.
Memory-failing probes stopped at the first captured event, then cancelled the run and closed streams. This proves an invocation limit, not that every retry or larger run must fail. The probe-only releases raised the example count guard to 100k, then restored it. Other gaps include outage-backlog recovery, general retained-release upgrade safety, multi-region capacity, retention and key rotation. Current platform documentation lists 128 MB per isolate, 10 GB per SQLite-backed object on Paid and 8 MB rows/values. An object’s documented 1,000 requests/s is soft, not an absolute ceiling.
Run the probes
export WORKFLOW_BASE_URL=https://your-worker.example.workers.dev
node scripts/remote-e2e.mjs
node scripts/remote-load.mjs 1000 50 --wait --verify
node scripts/remote-bench.mjs sequentialSteps:2000
node scripts/remote-limits.mjs streamBytes:1024x32The remote load script reports creation latency and errors. --wait --verify separately waits for completion and checks outputs. A distant single client measures its own network bottleneck too; use controlled in-region generation for a backend-admission experiment.
Sources and implementation
Repository links may require access. Vercel links point to public source or published documentation. Logical API names do not establish backend internals.