Skip to content
vxvx
GitHubBlueskydev.toRSS

// the vx blog

Performance

Posts tagged performance.

RSS

When running beats downloading

If a download would take longer than running the task, vx runs the task. 500 remote hits finish in 1.15 s instead of 3.12 s.

What a run does not do

A run does no cleanup at exit, never walks the shared store, and shows no "time saved" it did not measure.

Cache transfers wait on the network

Cache transfers mostly wait on the network, not a core. vx runs up to 64 at once, so 1,000 uploads to a cache 30 ms away take 2.5 s.

A cache hit is a file copy

A local cache hit is a file copy the kernel does. 1,000 hits of 96 KiB restore in 411 ms, and vx never hard-links.

Where a task run spends its time

We traced one workspace through vx, Turborepo 2.11.8 and Nx 23.3.0, cold and warm. A cold run is the tasks. A warm run is how little the tool does.

Carry the scheduler's memory between CI runners

A fresh CI runner has no run history, so it can't know which tasks are slow. One JSON file carries the learned times from runner to runner.

A cold run asks the cache nothing

With an empty cache, vx skips the lookups that would all miss. On 1,000 projects the first task starts 136 ms after vx run.

Which task runs first?

When more tasks are ready than workers, a runner has to pick. Five rules for picking, the graphs where each one wins and loses, measured with vx, and why recorded timings beat every rule that has to guess.

How many tasks at once? Count the cores you are given

In a container, the CPU count a program sees is the host's. vx reads the limit the kernel enforces, so it never starts more tasks than you have cores.

A scheduler that learns from your runs

@vzn/vx-history starts the longest chain first and keeps memory-hungry tasks apart, using times and memory from your past runs.

Why vx is fast: five decisions, not a trick

What vx adds to a run with nothing changed, with no daemon, and the five design choices behind that number.

No daemon, and still quick when nothing changed

vx has no background process watching your files. A run with nothing to do stays quick, and it can never act on a stale view of the tree.

Task priority in milliseconds, not 8.5 seconds

On a 3,270-task graph, task priority took 8.5 seconds with set unions. Bitsets do it in single-digit milliseconds, and cache restores never take a slot from a build.

Benchmarks you can re-run

One synthetic task graph, each tool in its own native config, every number one command away.

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