RunsOn runner benchmark.
2791 of 2857 jobs finished across every suite, 66 failed (Rust 1, TypeScript 48, Docker 2, Hardware 8, EC2 storage 6, Cache 1).
- TypeScript is borderline at 8 GB or less: RunsOn's 12 machines with 4–8 GB ran out of memory, 9 of them on some runs only; Blacksmith and Warpbuild never ran out; GitHub, Namespace and Ubicloud ran out on some runs; AWS CodeBuild ran out too; 16 GB passes everywhere.
- Measured swap at 8 GB or less: Blacksmith 2 vCPU has 11 GiB, GitHub 2 vCPU 3 GiB, RunsOn 2 vCPU 7.6 GiB, Ubicloud 2 vCPU 4 GiB and Warpbuild 2 vCPU 4 GiB; AWS CodeBuild 4 vCPU and Namespace 2 vCPU have none.
Fastest variant per build, any size
Fastest variant per build, any size
- Fastest arm64 TypeScript build: RunsOn m9g.2xlarge · tmpfs (8 vCPU) in 29s, ahead of Warpbuild xfast (Apple M4 Pro) 12 vCPU (12 vCPU, 31s).
Suggested default at 4 vCPU the rule
11m 02s and $0.0462 at spot for the three builds: the fastest of 4 on the default EBS volume, and none within 10% of its time costs less.
Suggested default at 4 vCPU the rule
12m 05s and $0.0660 at on-demand for the three builds: 10% slower than m8azn.xlarge, the fastest, and 34% cheaper.
Suggested default at 4 vCPU the rule
m9g.xlarge · EBS gp3 arm64
12m 12s and $0.0510 at spot for the three builds: the only variant on the default EBS volume that finished all three.
Suggested default at 4 vCPU the rule
m9g.xlarge · EBS gp3 arm64
12m 12s and $0.0539 at on-demand for the three builds: the only variant on the default EBS volume that finished all three.
Variants
Fastest firstCheapest first; × against RunsOn's fastest variant with 3 runs; cost per build at EC2 spoton-demand, on the whole job's time.
+18 more variants
+18 more variants
+18 more variants
+1 more variant
+1 more variant
+1 more variant
Bar shades, light to dark, in execution order: setup = checkout + packages + toolchaincargo fmtcargo testclippy
Bar shades, light to dark, in execution order: toolchainclonebun installtypecheck
Bar shades, light to dark, in execution order: fetch sourcebuildx setupdocker build
Same CPU, different disk
- m8a.2xlarge · EBS gp3 and m8a.2xlarge · gp3 1000 MiB/s m8a.2xlarge on EBS gp3 and on gp3 1000 MiB/s: Rust even within run-to-run spread (1m 25s–1m 29s on EBS gp3, 1m 23s–1m 31s on gp3 1000 MiB/s); TypeScript even within run-to-run spread (39s–48s on EBS gp3, 32s–39s on gp3 1000 MiB/s); Docker 4m 26s on gp3 1000 MiB/s vs 5m 39s.
- m8a.2xlarge · EBS gp3 and m8a.2xlarge · tmpfs m8a.2xlarge on EBS gp3 and on tmpfs: Rust even within run-to-run spread (1m 25s–1m 29s on EBS gp3, 1m 26s–1m 33s on tmpfs); TypeScript 30s on tmpfs vs 42s.
- m8a.2xlarge · gp3 1000 MiB/s and m8a.2xlarge · tmpfs m8a.2xlarge on gp3 1000 MiB/s and on tmpfs: Rust even within run-to-run spread (1m 23s–1m 31s on gp3 1000 MiB/s, 1m 26s–1m 33s on tmpfs); TypeScript even within run-to-run spread (32s–39s on gp3 1000 MiB/s, 29s–33s on tmpfs).
- m8azn.xlarge · gp3 1000 MiB/s and m8azn.xlarge · EBS gp3 m8azn.xlarge on gp3 1000 MiB/s and on EBS gp3: Rust even within run-to-run spread (1m 51s–1m 55s on gp3 1000 MiB/s, 1m 50s–1m 57s on EBS gp3); TypeScript 45s on gp3 1000 MiB/s vs 56s; Docker 6m 42s on gp3 1000 MiB/s vs 8m 13s.
- m8i.2xlarge · EBS gp3 and m8id.2xlarge · local NVMe m8i.2xlarge (EBS gp3) and m8id.2xlarge (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (1m 51s–2m 00s on EBS gp3, 1m 51s–2m 02s on local NVMe); TypeScript 44s on local NVMe vs 55s; Docker 5m 49s on local NVMe vs 7m 18s.
- m8i-flex.2xlarge · EBS gp3 and m8id.2xlarge · local NVMe m8i-flex.2xlarge (EBS gp3) and m8id.2xlarge (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (1m 54s–2m 06s on EBS gp3, 1m 51s–2m 02s on local NVMe); TypeScript 44s on local NVMe vs 58s; Docker 5m 49s on local NVMe vs 7m 29s.
- m8i-flex.large · EBS gp3 and m8id.large · local NVMe m8i-flex.large (EBS gp3) and m8id.large (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (4m 57s–5m 27s on EBS gp3, 4m 50s–5m 07s on local NVMe); TypeScript 2m 36s on EBS gp3 vs 3m 07s.
- m8i-flex.xlarge · EBS gp3 and m8id.xlarge · local NVMe m8i-flex.xlarge (EBS gp3) and m8id.xlarge (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (2m 53s–3m 02s on EBS gp3, 2m 50s–3m 00s on local NVMe); TypeScript 1m 20s on local NVMe vs 1m 28s; Docker 9m 18s on local NVMe vs 12m 15s.
- m8i.large · EBS gp3 and m8id.large · local NVMe m8i.large (EBS gp3) and m8id.large (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (4m 58s–5m 35s on EBS gp3, 4m 50s–5m 07s on local NVMe); TypeScript 2m 43s on EBS gp3 vs 3m 07s.
- m8i.xlarge · EBS gp3 and m8id.xlarge · local NVMe m8i.xlarge (EBS gp3) and m8id.xlarge (local NVMe) share the Xeon 6975P-C: Rust even within run-to-run spread (2m 56s–3m 00s on EBS gp3, 2m 50s–3m 00s on local NVMe); TypeScript 1m 20s on local NVMe vs 1m 29s; Docker 9m 18s on local NVMe vs 12m 10s.
- m9g.2xlarge · tmpfs and m9g.2xlarge · EBS gp3 m9g.2xlarge on tmpfs and on EBS gp3: Rust even within run-to-run spread (1m 24s–1m 42s on tmpfs, 1m 25s–1m 31s on EBS gp3); TypeScript 29s on tmpfs vs 42s.
- m9g.xlarge · EBS gp3 and m9g.xlarge · tmpfs m9g.xlarge on EBS gp3 and on tmpfs: Rust even within run-to-run spread (1m 59s–2m 05s on EBS gp3, 1m 58s–2m 06s on tmpfs); TypeScript 46s on tmpfs vs 1m 00s.
- m9g.2xlarge · tmpfs and m9gd.2xlarge · local NVMe m9g.2xlarge (tmpfs) and m9gd.2xlarge (local NVMe) share the Neoverse-V3: Rust even within run-to-run spread (1m 24s–1m 42s on tmpfs, 1m 20s–1m 36s on local NVMe); TypeScript even within run-to-run spread (29s–32s on tmpfs, 28s–31s on local NVMe).
- m9g.xlarge · EBS gp3 and m9gd.xlarge · local NVMe m9g.xlarge (EBS gp3) and m9gd.xlarge (local NVMe) share the Neoverse-V3: Rust even within run-to-run spread (1m 59s–2m 05s on EBS gp3, 1m 56s–2m 07s on local NVMe); TypeScript 50s on local NVMe vs 1m 00s; Docker 6m 23s on local NVMe vs 9m 10s.
- m9g.2xlarge · EBS gp3 and m9gd.2xlarge · local NVMe m9g.2xlarge (EBS gp3) and m9gd.2xlarge (local NVMe) share the Neoverse-V3: Rust even within run-to-run spread (1m 25s–1m 31s on EBS gp3, 1m 20s–1m 36s on local NVMe); TypeScript 30s on local NVMe vs 42s; Docker 4m 33s on local NVMe vs 5m 54s.
- m9g.large · EBS gp3 and m9gd.large · local NVMe m9g.large (EBS gp3) and m9gd.large (local NVMe) share the Neoverse-V3: Rust even within run-to-run spread (3m 01s–3m 25s on EBS gp3, 3m 01s–3m 10s on local NVMe); TypeScript within 1s of each other.
- m9g.xlarge · tmpfs and m9gd.xlarge · local NVMe m9g.xlarge (tmpfs) and m9gd.xlarge (local NVMe) share the Neoverse-V3: Rust even within run-to-run spread (1m 58s–2m 06s on tmpfs, 1m 56s–2m 07s on local NVMe); TypeScript 46s on tmpfs vs 50s.
Also differs in RAM (7)
- c8a.xlarge · EBS gp3 and r8a.xlarge · tmpfs c8a.xlarge (EBS gp3) and r8a.xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 8 vs 32 GiB): Rust even within run-to-run spread (1m 57s–2m 09s on EBS gp3, 1m 59s–2m 14s on tmpfs); TypeScript 48s on tmpfs vs 1m 03s.
- c8a.2xlarge · EBS gp3 and m8a.2xlarge · gp3 1000 MiB/s c8a.2xlarge (EBS gp3) and m8a.2xlarge (gp3 1000 MiB/s) share the EPYC 9R45 (RAM differs: 16 vs 32 GiB): Rust even within run-to-run spread (1m 21s–1m 32s on EBS gp3, 1m 23s–1m 31s on gp3 1000 MiB/s); TypeScript 33s on gp3 1000 MiB/s vs 47s; Docker 4m 26s on gp3 1000 MiB/s vs 7m 19s.
- c8a.2xlarge · EBS gp3 and m8a.2xlarge · tmpfs c8a.2xlarge (EBS gp3) and m8a.2xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 16 vs 32 GiB): Rust even within run-to-run spread (1m 21s–1m 32s on EBS gp3, 1m 26s–1m 33s on tmpfs); TypeScript 30s on tmpfs vs 47s.
- c8a.2xlarge · EBS gp3 and r8a.2xlarge · tmpfs c8a.2xlarge (EBS gp3) and r8a.2xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 16 vs 64 GiB): Rust even within run-to-run spread (1m 21s–1m 32s on EBS gp3, 1m 24s–1m 30s on tmpfs); TypeScript 31s on tmpfs vs 47s; Docker 3m 46s on tmpfs vs 7m 19s.
- m8a.2xlarge · EBS gp3 and r8a.2xlarge · tmpfs m8a.2xlarge (EBS gp3) and r8a.2xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 32 vs 64 GiB): Rust even within run-to-run spread (1m 25s–1m 29s on EBS gp3, 1m 24s–1m 30s on tmpfs); TypeScript 31s on tmpfs vs 42s; Docker 3m 46s on tmpfs vs 5m 39s.
- m8a.2xlarge · gp3 1000 MiB/s and r8a.2xlarge · tmpfs m8a.2xlarge (gp3 1000 MiB/s) and r8a.2xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 32 vs 64 GiB): Rust even within run-to-run spread (1m 23s–1m 31s on gp3 1000 MiB/s, 1m 24s–1m 30s on tmpfs); TypeScript even within run-to-run spread (32s–39s on gp3 1000 MiB/s, 29s–33s on tmpfs); Docker 3m 46s on tmpfs vs 4m 26s.
- m8a.xlarge · EBS gp3 and r8a.xlarge · tmpfs m8a.xlarge (EBS gp3) and r8a.xlarge (tmpfs) share the EPYC 9R45 (RAM differs: 16 vs 32 GiB): Rust even within run-to-run spread (1m 55s–2m 11s on EBS gp3, 1m 59s–2m 14s on tmpfs); TypeScript 48s on tmpfs vs 1m 01s.
Fixed costs not in cost per build
- Commercial Starter license $350/yearfewer than 50,000 runners a month; one fee per legal entity, every GitHub org and AWS account
- Commercial Growth license $1,050/yearfewer than 200,000 runners a month
- Commercial Scale license $2,100/yearfewer than 500,000 runners a month
- Commercial Enterprise license $4,200/year500,000 or more runners a month; priority support, Slack Connect, source-code access
The license scales with runners launched a month, never with minutes.
Free license for nonprofit, open-source, educational and personal non-commercial projects; 15-day free trial on the Starter tier. EC2 and EBS are paid to AWS, with no markup. Checked 2026-09-30
Over timeone point per run · since Sep 30
Loading every run…