Synthetic install matrix
All 22 recorded scenario comparisons across fnpm, Bun, pnpm, npm and Yarn.
This run was measured on October 25 and recorded in the October 26 report. The machine is an eight-core Xeon with 15.4 GiB RAM, Linux x64 and ext4, using Node 24.22.1 and hyperfine 1.15.0. All tools use the same pre-warmed local Verdaccio mirror and receive --ignore-scripts. npm also disables audit and funding requests.
Tools: fnpm 0.0.1, Bun 1.4.4, pnpm 12.15.0, npm 11.19.1, Yarn 1.22.22. Each row shows the mean of five measured runs after one warmup, with the fastest mean in bold. Do not compare these means directly with the separate real-project medians.
All recorded scenarios
| fixture | scenario | fnpm | bun | pnpm | npm | yarn |
|---|---|---|---|---|---|---|
| small | cold | 696 ms | 554 ms | 800 ms | 2.95 s | 3.28 s |
| small | cold-lockfile | 141 ms | 123 ms | 883 ms | 1.61 s | 2.76 s |
| small | warm | 21.1 ms | 35.3 ms | 212 ms | 1.24 s | 996 ms |
| small | noop | 2.7 ms | 7.2 ms | 135 ms | 581 ms | 399 ms |
| small | add | 10.8 ms | 9.7 ms | 221 ms | 662 ms | 824 ms |
| small | ci | 21.1 ms | 25.0 ms | 271 ms | 1.24 s | 1.07 s |
| medium | cold | 12.6 s | 12.8 s | 14.4 s | 47.8 s | 47.5 s |
| medium | cold-lockfile | 1.00 s | 1.16 s | 27.4 s | 11.7 s | 33.6 s |
| medium | warm | 71.6 ms | 141 ms | 446 ms | 9.97 s | 5.40 s |
| medium | noop | 3.0 ms | 10.5 ms | 148 ms | 701 ms | 420 ms |
| medium | add | 17.3 ms | 14.3 ms | 371 ms | 900 ms | 2.02 s |
| medium | ci | 60.0 ms | 141 ms | 442 ms | 9.85 s | 5.32 s |
| large | cold-lockfile | 1.35 s | 1.10 s | 42.2 s | 20.3 s | 38.9 s |
| large | warm | 185 ms | 230 ms | 1.00 s | 15.1 s | 15.4 s |
| large | noop | 2.2 ms | 62.4 ms | 148 ms | 2.83 s | 770 ms |
| large | add | 76.9 ms | 71.3 ms | 1.07 s | 3.22 s | 7.14 s |
| large | ci | 172 ms | 215 ms | 1.01 s | 15.2 s | 15.5 s |
| monorepo | cold-lockfile | 960 ms | 759 ms | 28.5 s | 12.5 s | 30.5 s |
| monorepo | warm | 176 ms | 157 ms | 685 ms | 9.65 s | 8.03 s |
| monorepo | noop | 3.2 ms | 27.2 ms | 143 ms | 1.45 s | 629 ms |
| monorepo | add | 49.1 ms | 30.3 ms | 4.42 s | 1.49 s | 3.98 s |
| monorepo | ci | 147 ms | 152 ms | 650 ms | 9.83 s | 7.56 s |
The report contains 22 comparisons with Bun. It has no cold row for large or monorepo; those scenarios were not recorded in this matrix. Missing rows are not wins.
cold has no lockfile. cold-lockfile has a prepared native lock. warm deletes node_modules but retains the cache. noop retains both. add starts from an installed project with warm cache; ci uses a frozen lock and warm cache. Full definitions.
Strict speed gate
The gate compares means from the same run and fails if fnpm is slower than Bun anywhere. It fails 9 of 22 comparisons:
- Small: cold, cold-lockfile and add.
- Medium: add.
- Large: cold-lockfile and add.
- Monorepo: cold-lockfile, warm and add.
The comparison uses a strict lower-mean target. It is not a statistical significance test. Small differences, such as medium cold, should be interpreted with their sample ranges and standard deviations in the full report.
Combined physical disk
These values include node_modules plus the extra tool cache/store with shared inodes counted once.
| fixture | fnpm | bun | pnpm | npm | yarn |
|---|---|---|---|---|---|
| small | 16.7 MiB | 17.1 MiB | 21.7 MiB | 19.3 MiB | 34.7 MiB |
| medium | 502.7 MiB | 506.6 MiB | 777.7 MiB | 627.2 MiB | 3.7 GiB |
| large | 423.0 MiB | 446.4 MiB | 836.7 MiB | 510.0 MiB | 1.0 GiB |
| monorepo | 407.6 MiB | 425.6 MiB | 553.9 MiB | 493.4 MiB | 2.5 GiB |
fnpm is lower than Bun and pnpm on all four combined totals. fnpm’s extra store/cache alone is larger than Bun’s on each fixture. The underlying report separates node_modules, extra store/cache, unique inodes, directory entries and cold filesystem deltas.
The cold filesystem delta is also lower than Bun and pnpm in this run. It can include unrelated writes on the shared filesystem. Directory-walk measurements do not identify shared reflink extents, so another filesystem may change the relationship between apparent, allocated and shared bytes.
Provenance and limits
Source revision: 23cc2210361a8f4b5b53221aa48b76a4dff55163. Native launcher SHA-256: cd278a4690db221dca51b63a76b9ce929a651bdec9b49b10905b7191f1436aac.
Synthetic fixtures contain manifests, with each tool’s native lock generated outside the timed section. Every tool uses its default linker. Workspace fixtures use * for cross-workspace references because npm does not accept workspace:. The medium fixture derives from Bun’s Next.js/T3 install benchmark.
Cold resolution and pnpm cold-lockfile timings include Verdaccio’s metadata serialization overhead. The mirror is the same for all tools, but its latency changes ratios compared with a public registry. Script work, project builds and migration are outside the timing. Linux results do not establish macOS or Windows performance.
The full report with deviations, ranges and run counts and harness protocol contain the underlying evidence.