Skip to content

Benchmarks

This page mirrors the scenarios from the pnpm benchmarks page and adds aube to the comparison. The package manager versions, the test package set, and the scenario definitions are the same so the numbers can be read alongside pnpm's published results.

Methodology

Each row is a different starting state — what's already on disk before the command runs. This matters far more for install time than raw download speed, because most real-world installs have some state to reuse.

Scenarios

Scenariocachelockfilenode_modules
clean install
with cache
with lockfile
with node_modules
with cache, lockfile, node_modules
with cache, lockfile
with cache, node_modules
with lockfile, node_modules
update
  • clean install is the worst case — a fresh CI runner with no caches.
  • with lockfile is the typical CI hit-rate scenario when restoring a lockfile but no node_modules cache.
  • with cache, lockfile, node_modules is the typical local-dev no-op case.
  • update runs <pm> update instead of <pm> install.

Real-world dependency set

A medium-sized package set spanning the major framework / tooling ecosystems (React, Vue, Express, ESLint, TypeScript, RxJS, …) — see bench/fixture/package.json. Lower is better. Numbers are from bench/run.sh, which uses hyperfine to time three runs of each command after restoring the relevant on-disk state.

npm Yarn pnpm aube
clean install
npm
4.18s
Yarn
4.59s
pnpm
1.02s
aube
824ms
with cache
npm
1.54s
Yarn
2.81s
pnpm
849ms
aube
187ms
with lockfile
npm
1.23s
Yarn
1.86s
pnpm
480ms
aube
329ms
with node_modules
npm
266ms
Yarn
4.21s
pnpm
aube
956ms
with cache, lockfile, node_modules (no-op)
npm
215ms
Yarn
139ms
pnpm
262ms
aube
43ms
with cache, lockfile
npm
919ms
Yarn
551ms
pnpm
457ms
aube
48ms
with cache, node_modules
npm
234ms
Yarn
2.89s
pnpm
465ms
aube
187ms
with lockfile, node_modules
npm
258ms
Yarn
143ms
pnpm
278ms
aube
1.02s
update
npm
863ms
Yarn
2.05s
pnpm
1.34s
aube
161ms
actionnpmYarnpnpmaube
clean install4.18s4.59s1.02s824ms
with cache1.54s2.81s849ms187ms
with lockfile1.23s1.86s480ms329ms
with node_modules266ms4.21s956ms
with cache, lockfile, node_modules (no-op)215ms139ms262ms43ms
with cache, lockfile919ms551ms457ms48ms
with cache, node_modules234ms2.89s465ms187ms
with lockfile, node_modules258ms143ms278ms1.02s
update863ms2.05s1.34s161ms

Reproduce locally

sh
cargo build --release
AUBE_BIN=$PWD/target/release/aube bench/run.sh --runs 3

The script writes bench/results.json and a markdown table at bench/results.md.

The headline result is the no-op case (with cache, lockfile, node_modules): 43 ms, which is what every aube test invocation pays when nothing has changed since the last install. That's 6× faster than pnpm's 262 ms and an order of magnitude faster than npm and Yarn.

aube test vs pnpm install-test

A common workflow on a fresh checkout (or after pulling new commits) is "install dependencies, then run tests". pnpm exposes this as pnpm install-test — a single command that installs and then runs the test script. npm has the same shortcut as npm install-test (npm it); Yarn users typically chain yarn install && yarn test.

aube collapses this further. Because aube test (and any other aube run target) auto-installs when the lockfile or package.json is stale, you don't need a separate command at all — just aube test.

commandwhat it doesaube equivalent
npm install-test (npm it)install, then npm testaube test
yarn install && yarn testinstall, then yarn testaube test
pnpm install-testinstall, then pnpm testaube test

Numbers

Same fixture set as above, "install + test" measured end-to-end. The "test" script is a no-op so this measures the install pipeline plus the cost of shelling out to run the script.

actionnpm install-testyarn && testpnpm install-testaube test
clean31.5s7.6s7.8sTBD
with cache13.6s5.9s4.8sTBD
with cache, lockfile4.6s5.7s2.4sTBD
with cache, lockfile, node_modules (no-op install)1.4s5.3s850msTBD

The last row is the most interesting one for day-to-day work: it's what happens every time you run your tests when nothing has changed. aube's goal here is to make the staleness check effectively free so aube test feels the same as just running the underlying test command directly.

Released under the MIT License.