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
| Scenario | cache | lockfile | node_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_modulescache. - with cache, lockfile, node_modules is the typical local-dev no-op case.
- update runs
<pm> updateinstead 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.
| action | npm | Yarn | pnpm | aube |
|---|---|---|---|---|
| clean install | 4.18s | 4.59s | 1.02s | 824ms |
| with cache | 1.54s | 2.81s | 849ms | 187ms |
| with lockfile | 1.23s | 1.86s | 480ms | 329ms |
| with node_modules | 266ms | 4.21s | — | 956ms |
| with cache, lockfile, node_modules (no-op) | 215ms | 139ms | 262ms | 43ms |
| with cache, lockfile | 919ms | 551ms | 457ms | 48ms |
| with cache, node_modules | 234ms | 2.89s | 465ms | 187ms |
| with lockfile, node_modules | 258ms | 143ms | 278ms | 1.02s |
| update | 863ms | 2.05s | 1.34s | 161ms |
Reproduce locally
cargo build --release
AUBE_BIN=$PWD/target/release/aube bench/run.sh --runs 3The 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.
| command | what it does | aube equivalent |
|---|---|---|
npm install-test (npm it) | install, then npm test | aube test |
yarn install && yarn test | install, then yarn test | aube test |
pnpm install-test | install, then pnpm test | aube 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.
| action | npm install-test | yarn && test | pnpm install-test | aube test |
|---|---|---|---|---|
| clean | 31.5s | 7.6s | 7.8s | TBD |
| with cache | 13.6s | 5.9s | 4.8s | TBD |
| with cache, lockfile | 4.6s | 5.7s | 2.4s | TBD |
| with cache, lockfile, node_modules (no-op install) | 1.4s | 5.3s | 850ms | TBD |
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.