Reproducible measurements

How fast is pnpm, really?

Installing two real projects with npm, two generations of pnpm, and three pnpm configurations — and installing Node.js itself against fnm and nvm.

Data fetched Oct 4, 2026 from pnpm/benchmarks, rebuilt on every deploy.
Package managers

Install Speed

Two projects installed six ways each — the cache and lockfile states you actually end up in, from a fresh clone to a warm re-run.

Tools
Projects
Every bar shares one scale, so scenarios are comparable with each other. Tools stay in the same order in every scenario.

alotta-files

A wide dependency graph of small packages — lots of files to link, little to resolve.

6/6scenarios where pnpm beats npm
58xfaster than npm on “everything warm”
18mspnpm's best run — “everything warm”
cleanA fresh clone. Nothing cached.
npm
45.6s13x slower
pnpm 11
7.93s2.3x slower
pnpm 12
4.47s1.3x slower
pnpm 12 + pnpr
3.51s
pnpm 12 + global store
4.77s1.4x slower
pnpm 12 hoisted
4.50s1.3x slower
lockfileCI, first install.
npm
11.5s3.5x slower
pnpm 11
4.83s1.5x slower
pnpm 12
3.35s
pnpm 12 + pnpr
3.39s
pnpm 12 + global store
3.32s
pnpm 12 hoisted
3.58s1.1x slower
cacheReinstalling without a lockfile.
npm
10.9s18x slower
pnpm 11
4.09s6.8x slower
pnpm 12
1.05s1.7x slower
pnpm 12 + pnpr
851ms1.4x slower
pnpm 12 + global store
601ms
pnpm 12 hoisted
974ms1.6x slower
cache + lockfileReinstalling a project you already have.
npm
7.14s32x slower
pnpm 11
2.33s11x slower
pnpm 12
826ms3.8x slower
pnpm 12 + pnpr
872ms4.0x slower
pnpm 12 + global store
220ms
pnpm 12 hoisted
641ms2.9x slower
everything warmRunning install when nothing changed.
npm
1.03s61x slower
pnpm 11
512ms30x slower
pnpm 12
18ms1.1x slower
pnpm 12 + pnpr
17ms
pnpm 12 + global store
17ms
pnpm 12 hoisted
18ms1.1x slower
updateA dependency was bumped in package.json.
npm
4.09s4.1x slower
pnpm 11
3.69s3.7x slower
pnpm 12
1.02s
pnpm 12 + pnpr
1.06s1.1x slower
pnpm 12 + global store
996ms
pnpm 12 hoisted
1.27s1.3x slower

Total across all scenarios

  1. pnpm 12 + pnpr9.70sfastest
  2. pnpm 12 + global store9.93sfastest
  3. pnpm 1210.7s1.1x slower
  4. pnpm 12 hoisted11.0s1.1x slower
  5. pnpm 1123.4s2.4x slower
  6. npm1m 20s8.3x slower

All 6 scenarios added up.

Exact numbers

Install Speed on alotta-files — fastest run per scenario.
Scenarionpmv12.2.0pnpm 11v11.28.2pnpm 12v12.9.1pnpm 12 + pnprv12.9.1pnpm 12 + global storev12.9.1pnpm 12 hoistedv12.9.1
cleanA fresh clone. Nothing cached.45.6s7.93s4.47s3.51s4.77s4.50s
lockfileCI, first install.11.5s4.83s3.35s3.39s3.32s3.58s
cacheReinstalling without a lockfile.10.9s4.09s1.05s851ms601ms974ms
cache + lockfileReinstalling a project you already have.7.14s2.33s826ms872ms220ms641ms
everything warmRunning install when nothing changed.1.03s512ms18ms17ms17ms18ms
updateA dependency was bumped in package.json.4.09s3.69s1.02s1.06s996ms1.27s
Measured with npm 12.2.0 · pnpm 11 11.28.2 · pnpm 12 12.9.1 · pnpm 12 + pnpr 12.9.1 · pnpm 12 + global store 12.9.1 · pnpm 12 hoisted 12.9.1.

alotta-packages

Fourteen modern toolchains — Angular, Nest, Vite, webpack, Storybook — resolving to about a gigabyte.

6/6scenarios where pnpm beats npm
168xfaster than npm on “everything warm”
19mspnpm's best run — “everything warm”
cleanA fresh clone. Nothing cached.
npm
1m 43s11x slower
pnpm 11
23.6s2.6x slower
pnpm 12
14.1s1.5x slower
pnpm 12 + pnpr
9.16s
pnpm 12 + global store
15.2s1.7x slower
pnpm 12 hoisted
15.1s1.7x slower
cacheReinstalling without a lockfile.
npm
35.4s21x slower
pnpm 11
16.9s10x slower
pnpm 12
3.31s2.0x slower
pnpm 12 + pnpr
2.52s1.5x slower
pnpm 12 + global store
1.66s
pnpm 12 hoisted
3.23s1.9x slower
lockfileCI, first install.
npm
30.6s3.5x slower
pnpm 11
12.6s1.4x slower
pnpm 12
8.87s
pnpm 12 + pnpr
8.94s
pnpm 12 + global store
9.10s
pnpm 12 hoisted
10.3s1.2x slower
cache + lockfileReinstalling a project you already have.
npm
20.7s38x slower
pnpm 11
5.45s9.9x slower
pnpm 12
2.50s4.5x slower
pnpm 12 + pnpr
2.56s4.7x slower
pnpm 12 + global store
550ms
pnpm 12 hoisted
2.26s4.1x slower
everything warmRunning install when nothing changed.
npm
3.19s177x slower
pnpm 11
496ms28x slower
pnpm 12
19ms1.1x slower
pnpm 12 + pnpr
18ms
pnpm 12 + global store
19ms1.1x slower
pnpm 12 hoisted
18ms
updateA dependency was bumped in package.json.
npm
14.9s7.0x slower
pnpm 11
12.2s5.8x slower
pnpm 12
2.85s1.3x slower
pnpm 12 + pnpr
2.13s
pnpm 12 + global store
2.65s1.2x slower
pnpm 12 hoisted
3.73s1.8x slower

Total across all scenarios

  1. pnpm 12 + pnpr25.3sfastest
  2. pnpm 12 + global store29.2s1.2x slower
  3. pnpm 1231.6s1.2x slower
  4. pnpm 12 hoisted34.6s1.4x slower
  5. pnpm 111m 11s2.8x slower
  6. npm3m 28s8.2x slower

All 6 scenarios added up.

Exact numbers

Install Speed on alotta-packages — fastest run per scenario.
Scenarionpmv12.2.0pnpm 11v11.28.2pnpm 12v12.9.1pnpm 12 + pnprv12.9.1pnpm 12 + global storev12.9.1pnpm 12 hoistedv12.9.1
cleanA fresh clone. Nothing cached.1m 43s23.6s14.1s9.16s15.2s15.1s
cacheReinstalling without a lockfile.35.4s16.9s3.31s2.52s1.66s3.23s
lockfileCI, first install.30.6s12.6s8.87s8.94s9.10s10.3s
cache + lockfileReinstalling a project you already have.20.7s5.45s2.50s2.56s550ms2.26s
everything warmRunning install when nothing changed.3.19s496ms19ms18ms19ms18ms
updateA dependency was bumped in package.json.14.9s12.2s2.85s2.13s2.65s3.73s
Measured with npm 12.2.0 · pnpm 11 11.28.2 · pnpm 12 12.9.1 · pnpm 12 + pnpr 12.9.1 · pnpm 12 + global store 12.9.1 · pnpm 12 hoisted 12.9.1.
  • Two projects, run separately: "alotta-files" is a wide graph of small packages, "alotta-packages" is fourteen modern toolchains resolving to about a gigabyte. Both are shown because they do not agree — pnpm leads on each, but by different margins, and pnpr gains far more on the larger graph.
  • Within a project the only thing that changes is the package manager, and every manager is measured with the same versions on both projects. Numbers are never combined across projects.
  • Each number is the fastest of the three most recent runs.
  • Everything installs through the same registry over the same emulated link (50ms, 200Mbps), so the times include the round trips a real install pays for.
  • Six scenarios here. The suite measures three more that delete your cache or lockfile but keep node_modules — nobody works that way, so they are left out.
  • pnpm 12 + pnpr is the same version and the same command, with resolution handled by the registry instead of locally.
  • The three columns after pnpm 12 are that same pnpm 12 configured differently — a global virtual store, a hoisted node_modules, and registry-side resolution. They are shown to make the cost of each setting visible, and are left out of the headline numbers above, which describe pnpm as it installs by default.
Node.js version managers

Node.js Version Management

pnpm installs and switches Node.js versions itself, so you may not need a version manager at all. Here it is against fnm and nvm.

Every bar shares one scale, so scenarios are comparable with each other. Tools stay in the same order in every scenario.
2/3scenarios where pnpm is fastest
15xfaster than nvm on “install (warm store)”
5mspnpm's best run — “run in project”
install (clean)Install Node.js 24, nothing cached.
pnpm
1.01s
fnm
2.98s2.9x slower
nvm
2.99s3.0x slower
install (warm store)Install a version you had before.
pnpm
162ms
fnm
2.95s18x slower
nvm
2.42s15x slower
run in projectRun node in a project pinned to Node.js 22.
pnpm
5ms1.1x slower
fnm
5ms
nvm
78ms16x slower

Total across all scenarios

  1. pnpm1.18sfastest
  2. nvm5.49s4.7x slower
  3. fnm5.94s5.0x slower

All 3 scenarios added up.

Exact numbers

Node.js Version Management — fastest run per scenario.
Scenariopnpmv12.9.1fnmv1.39.0nvmv0.40.8
install (clean)Install Node.js 24, nothing cached.1.01s2.98s2.99s
install (warm store)Install a version you had before.162ms2.95s2.42s
run in projectRun node in a project pinned to Node.js 22.5ms5ms78ms
Measured with pnpm 12.9.1 · fnm 1.39.0 · nvm 0.40.8.
  • pnpm keeps Node.js in its store, so a version it has seen before needs no download.
  • There is no switch command — the node on your PATH is whatever the project asks for.
  • Timed inside a shell with $EPOCHREALTIME, because nvm is a shell function rather than a binary.

How these numbers are produced

Every tool runs on the same machine against the same project, and the timings are committed to pnpm/benchmarks. This page reads them at build time and picks the newest version of each tool.

This is one project on one machine — your numbers will differ. Run pnpm run benchmark to see your own.