Runners
5 min read

CircleCI vs BuildPulse runners: same pipeline, 1.7x faster, for 61% less

We kept a CircleCI pipeline exactly as it was and swapped only the machine under it. Three real builds, 10 runs each at 4 vCPU: 1.7x faster than CircleCI's Large, and 61% to 62% less per build.

BuildPulse Team

October 15, 2026

1.7x

faster than CircleCI Large, both 4 vCPU

61%

less per build than on Large, at the least

73%

less per Docker build than on Large Gen 2

It is easy to pick a CircleCI resource class once and never think about it again. large is the default 4 vCPU machine, it works, and the bill is just the bill.

So here is the question this post answers: what happens if you keep the pipeline exactly as it is and swap only the machine underneath it?

CircleCI supports that out of the box through its self-hosted runner. Your config, contexts, approvals and test insights all stay in CircleCI. Only the job itself lands somewhere else, and here that somewhere is a BuildPulse x64-4x.

We took three real open-source builds, pinned every version, and ran each one 10 times on CircleCI's Large, 10 times on its newer Large Gen 2, and 10 times on BuildPulse. All three machines are 4 vCPU, and every run was in production on October 13, 2026. They are the same workloads behind our GitHub Actions benchmark, and the CircleCI config, the script that writes it and every run's time are in github.com/buildpulse/runner-benchmarks, so you can check our work.

The race

These are the median job times, straight from CircleCI's own job timer. Press play and the three machines run side by side, sped up but kept in proportion, so the gaps you see are the real gaps:

Median job time, replayed to scale

Docker image build hugo's own Dockerfile, no cache

1.8x faster than Large

CircleCI Large

229.3 s

CircleCI Large Gen 2

175.4 s

BuildPulse x64-4x

129.2 s

Node install, build and tests vuejs/core, pinned

1.7x faster than Large

CircleCI Large

80.9 s

CircleCI Large Gen 2

57.4 s

BuildPulse x64-4x

47.8 s

Go compile hugo, pinned

1.7x faster than Large

CircleCI Large

60.3 s

CircleCI Large Gen 2

40 s

BuildPulse x64-4x

35.5 s

The Docker build is the one to watch. On Large it took 3 min 49 s. On BuildPulse it took 2 min 9 s, 1.8x faster. Node and Go told the same story, and across the three builds BuildPulse finished 1.7x to 1.8x faster than Large.

Large Gen 2 is CircleCI's answer to slow builds, and it is quicker than Large. It also costs 36 credits a minute instead of 20. BuildPulse still came out ahead on every build, 1.1x to 1.4x faster.

Straight from CircleCI

The animation is built from CircleCI's numbers, but you should not have to take an animation's word for it. Here is round 1 of the Docker build in CircleCI's own UI, first on Large and then on BuildPulse. Look at the time under each job name, and at the line the toolchain step printed:

CircleCI · Machine / Large

CircleCI job page for docker-build-cci-4x-r1 on Machine / Large: 3m 56s, toolchain step printing nproc=4 and cpu=Intel Xeon Platinum 8375C
CircleCI's Large, round 1 of the Docker build: 3m 56s, on an Intel Xeon Platinum 8375C.

CircleCI · self-hosted runner on BuildPulse

CircleCI job page for docker-build-bp-4x-r1 on resource class buildpulse-dev/bp-prod-x64-4x: 2m 12s, toolchain step printing nproc=4 and cpu=AMD EPYC 9R45
The same build on BuildPulse, through a self-hosted runner: 2m 12s, on an AMD EPYC 9R45.

Where the speed comes from

There is no trick in the config. Most of the gap is the chip, and every job printed the one it ran on. Here are all three:

CircleCI Large

Intel Xeon Platinum 8375C

Ice Lake

CircleCI Large Gen 2

AMD EPYC 9R14

Zen 4

BuildPulse x64-4x

AMD EPYC 9R45

Zen 5, newest

CircleCI's Large runs on Intel's Ice Lake, a server generation from 2021. Gen 2 moves up to AMD's Zen 4. BuildPulse machines run on Zen 5, the newest server generation AMD makes. Installs, compiles and image builds lean hard on per-core speed, so a newer core shows up directly in the job time.

What one build costs

Faster is nice. Cheaper is the part someone eventually asks about.

CircleCI bills in credits. Large is 20 credits a minute and Gen 2 is 36, at $0.0006 a credit, which works out to $0.012 and $0.0216 a minute. A job on a self-hosted runner uses no CircleCI credits for its run time, so a BuildPulse minute is our rate and nothing else: $0.008.

Multiply each machine's median time by its price per minute and you get the cost of a single build:

WorkloadCircleCI LargeCircleCI Large Gen 2BuildPulse x64-4xLess than CircleCI LargeLess than CircleCI Large Gen 2
Docker image build$0.0459$0.0631$0.017262%73%
Node install, build and tests$0.0162$0.0207$0.006461%69%
Go compile$0.0121$0.0144$0.004761%67%

The two savings stack. You pay less for each minute, and you use fewer minutes. One build comes out 61% to 62% cheaper than on Large and 67% to 73% cheaper than on Gen 2. Put another way, every $100 you spend on Docker builds on Large becomes about $38 on BuildPulse. For Node it is $39, and for Go $39.

Drag the slider to your own build volume:

Your month

5,000 builds a month

CircleCI Large

$229

BuildPulse x64-4x

$86

A year on BuildPulse

$1,718kept, 62% of the bill

and 139 fewer hours of builds every month.

Median benchmark time at each side's list price per minute, before any free allowance.

Two CircleCI rules still apply on a self-hosted runner, and they are worth knowing before you move anything. Restoring caches and workspaces counts as network transfer, at 420 credits per GB once you pass your plan's allowance (persisting data). These builds restore no cache, so they paid none. CircleCI also limits how many self-hosted jobs run at once: 5 on Free, 20 on Performance, unlimited on Scale.

Try it on one job

You do not have to move a whole pipeline to find out whether this holds for your builds. Create a resource class in CircleCI, paste its token into BuildPulse, and change two lines on one job:

.circleci/config.yml

 jobs:   build:-    machine:-      image: ubuntu-2404:current-    resource_class: large+    machine: true+    resource_class: your-namespace/bp-x64-4x

That job now runs on BuildPulse, and everything else stays where it was. Each job gets a fresh machine, usually running in under a minute. If your numbers look like ours, move the next job. The full rate table, with a monthly bill next to CircleCI's, is on buildpulse.io/pricing, and every class side by side is on BuildPulse vs CircleCI machines.

How we measured

  • The same jobs: vuejs/core v3.5.13 (install, build, unit tests), hugo v0.139.3 (Go compile) and hugo's own Dockerfile at the same tag, with no cache.
  • The same toolchain: Node 20.18.1 and Go 1.23.4, installed from the same tarballs on every machine, so the machine is the only thing that changes.
  • 10 runs per machine, one after another so no two runs competed, medians reported.
  • CircleCI's clock, not ours: job time is CircleCI's own job duration, the number its bill is based on.

Think something is off, or seeing different numbers on your own builds? Open an issue and tell us.

CircleCI prices from CircleCI pricing and its price list, checked October 5, 2026.

Move one CircleCI job and compare the bill

Create a resource class, paste its token into BuildPulse, and point one job at it. Everything else stays on CircleCI.

3,000 free minutes every month · No credit card required