prettier's test suite, 2.1x faster for the same price per minute
We ran prettier's own tests, unchanged, three times on each runner. The only thing that changes between columns is runs-on. Runloft 4 vCPU costs $0.006 a minute, the same as GitHub's 2-core Linux runner for private repositories, and finished the tests in 3:01 against 6:20.
Results
Median of three runs, range in brackets. prettier at 8f0c950, Node.js 22, November 3, 2026. Cost per job is the median job time at each runner's list price: GitHub bills whole minutes, Runloft bills seconds.
| Runner | yarn test | yarn install | Whole job | Price / min | Cost / job |
|---|---|---|---|---|---|
GitHub-hosted ubuntu-latestubuntu-latest | 6:20 (3:59–7:24) | 25 s | 7:03 | $0.006 | $0.048 |
Runloft 4 vCPUrunloft-ubuntu-24.04-4cpu | 3:01 (2:30–3:23) | 28 s | 4:05 | $0.006 | $0.024 |
GitHub's price is the 2-core Linux runner for private repositories. Public repositories get a 4-core ubuntu-latest for free, so for open source the comparison that matters is speed, not price.
What the numbers say
- For a test suite, use
runloft-ubuntu-24.04-4cpu. It costs the same per minute as GitHub's default private runner, finishes in about half the time, and so costs about half per job. prettier's Jest runs one worker per spare core, so four cores give it three workers where two cores give it one. - GitHub-hosted times moved from 3:59 to 7:24 on identical work: the three jobs landed on three different CPU models. Ours reported the same CPU on every run.
Run it yourself
Install the GitHub App on any repository, add this workflow and run it from the Actions tab. The 3,000 free minutes a month cover it many times over; the GitHub-hosted jobs use your GitHub minutes.
name: bench
on: workflow_dispatch
jobs:
bench:
strategy:
fail-fast: false
matrix:
runner: [ubuntu-latest, runloft-ubuntu-24.04-4cpu]
rep: [1, 2, 3]
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/setup-node@v4
with: { node-version: 22 }
- name: clone
run: git clone -q https://github.com/prettier/prettier.git p && git -C p checkout -q 8f0c950
- name: install
working-directory: p
run: corepack enable && yarn install --immutable
- name: test
working-directory: p
run: yarn testBetter still, run your own suite: change runs-on on one job in a branch and compare the two runs. More on sizes in labels and machine types.