Skip to content

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.

prettier test suite: time and cost per runner
Runneryarn testyarn installWhole jobPrice / minCost / job
GitHub-hosted ubuntu-latest
ubuntu-latest
6:20 (3:59–7:24)25 s7:03$0.006$0.048
Runloft 4 vCPU
runloft-ubuntu-24.04-4cpu
3:01 (2:30–3:23)28 s4: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.

.github/workflows/bench.yml
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 test

Better 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.