Skip to content
vxvx
GitHubBlueskydev.toRSS
Blog

vx on real repos: wall times

Seven open-source monorepos that already run on Turborepo or Nx, timed under their own runner and under vx: cold, cache restore, one-file edit and a clean clone. Raw seconds, min of three, slower rows included.

The synthetic benchmark runs one generated graph. This post times repos someone else wrote: open-source monorepos that already use Turborepo or Nx, each moved to native vx config, then run under both tools on the same machine.

Both tools build the same outputs; that is the assumption behind every row.

  • One cloud container: 4 vCPU (Intel Xeon @ 2.10GHz), 15 GB RAM, Linux, nothing else running. Bun 1.4.2, Node 22.22.0.
  • vx built from main with bun build --compile: 522c23b for create-t3-turbo, react-email, trpc and typescript-eslint; 731cf92 for vercel/ai, medusa and TanStack query; 1ee058c for the react-email clone row.
  • Configs written by bunx @vzn/vx-migrate --native --no-install, then vx lock.
  • Concurrency 10 for every tool: Turborepo --concurrency=10, Nx --parallel=10, vx --concurrency 10.
  • Local cache only: no remote cache, no daemon, no telemetry.
  • Four arms, each tool wiping only its own cache:
    • cold: cache and every build output wiped.
    • restore: outputs wiped, cache kept.
    • edit: one source file gets a new line (new content each rep), outputs kept.
    • clone: a fresh git clone at another path, node_modules copied, sharing the first checkout’s cache, with no outputs.
  • Three reps, the order alternating between tools. Each cell is the minimum of the three, in seconds. Every run exited 0.

Seconds, min of 3. Shorter bars are less time; each chart keeps its table one click away.

build typecheck, 11 tasks, commit 8f945b7.

cold
Turborepo 2.5.813.63 s
vx10.97 s
restore
Turborepo 2.5.80.28 s
vx0.09 s
edit
Turborepo 2.5.84.69 s
vx4.89 s
edit, clean: false
Turborepo 2.5.84.61 s
vx3.83 s
clone
Turborepo 2.5.80.28 s
vx0.11 s
The table
ArmTurborepo 2.5.8vx
cold13.63 s10.97 s
restore0.28 s0.09 s
edit4.69 s4.89 s
edit, clean: false4.61 s3.83 s
clone0.28 s0.11 s

Both edit rows are a rerun on vx 5b2b0a1 (same machine shape, min of 3). The second sets cache.outputs.clean: false on the three tsc build tasks: by default vx deletes a task’s declared outputs before it runs on a miss, tsc’s .cache/tsbuildinfo.json included, so tsc rebuilds api from scratch.

build, 4 tasks, commit 1531a39.

cold
Turborepo 2.9.1428.92 s
vx25.11 s
restore
Turborepo 2.9.140.32 s
vx0.22 s
edit
Turborepo 2.9.1428.23 s
vx26.29 s
clone
Turborepo 2.9.140.34 s
vx0.26 s
The table
ArmTurborepo 2.9.14vx
cold28.92 s25.11 s
restore0.32 s0.22 s
edit28.23 s26.29 s
clone0.34 s0.26 s

build, 7 tasks, commit d756e59.

cold
Turborepo 2.10.129.29 s
vx7.48 s
restore
Turborepo 2.10.120.17 s
vx0.15 s
edit
Turborepo 2.10.129.40 s
vx7.04 s
clone
Turborepo 2.10.120.16 s
vx0.13 s
The table
ArmTurborepo 2.10.12vx
cold9.29 s7.48 s
restore0.17 s0.15 s
edit9.40 s7.04 s
clone0.16 s0.13 s

build, 82 tasks, commit e8c8e32.

cold
Turborepo 2.9.14144.96 s
vx135.33 s
restore
Turborepo 2.9.140.92 s
vx0.45 s
edit
Turborepo 2.9.14156.38 s
vx145.61 s
clone
Turborepo 2.9.140.97 s
vx0.65 s
The table
ArmTurborepo 2.9.14vx
cold144.96 s135.33 s
restore0.92 s0.45 s
edit156.38 s145.61 s
clone0.97 s0.65 s

build build:plugin, 83 tasks, commit 5018ab67.

cold
Turborepo 1.13.4316.57 s
vx307.81 s
restore
Turborepo 1.13.43.56 s
vx3.45 s
edit
Turborepo 1.13.4268.92 s
vx259.96 s
clone
Turborepo 1.13.42.59 s
vx3.54 s
The table
ArmTurborepo 1.13.4vx
cold316.57 s307.81 s
restore3.56 s3.45 s
edit268.92 s259.96 s
clone2.59 s3.54 s

build, 25 tasks, commit 817bd02.

cold
Nx 23.2.135.01 s
vx29.37 s
restore
Nx 23.2.10.94 s
vx0.32 s
edit
Nx 23.2.134.10 s
vx29.03 s
clone
Nx 23.2.10.96 s
vx0.58 s
The table
ArmNx 23.2.1vx
cold35.01 s29.37 s
restore0.94 s0.32 s
edit34.10 s29.03 s
clone0.96 s0.58 s

build, 18 tasks, commit 57e7cccce.

cold
Nx 23.2.052.50 s
vx41.77 s
restore
Nx 23.2.04.45 s
vx5.32 s
edit
Nx 23.2.040.69 s
vx38.97 s
clone
Nx 23.2.04.15 s
vx5.37 s
The table
ArmNx 23.2.0vx
cold52.50 s41.77 s
restore4.45 s5.32 s
edit40.69 s38.97 s
clone4.15 s5.37 s
Terminal window
npx @vzn/vx init
npx @vzn/vx run build --all

Then time your runner’s command and vx run on the same machine, each on its own cache. More at vznjs.github.io/vx.

Turborepo, Nx and other product names are trademarks of their owners. vx is not affiliated with or endorsed by them.