Benchmarks

How fast is pnpm, really? We install two real projects with npm, two generations of pnpm, and three pnpm configurations — and install Node.js itself against fnm and nvm.

Data fetched Nov 12, 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
42xfaster than npm on “everything warm”
16mspnpm's best run — “everything warm”
cleanA fresh clone. Nothing cached.
npm
43.2s17x slower
pnpm 11
7.26s2.9x slower
pnpm 12
4.44s1.8x slower
pnpm 12 + pnpr
2.50s
pnpm 12 + global store
4.72s1.9x slower
pnpm 12 hoisted
4.57s1.8x slower
lockfileCI, first install.
npm
10.4s4.2x slower
pnpm 11
4.41s1.8x slower
pnpm 12
3.30s1.3x slower
pnpm 12 + pnpr
2.48s
pnpm 12 + global store
3.33s1.3x slower
pnpm 12 hoisted
3.62s1.5x slower
cacheReinstalling without a lockfile.
npm
7.46s17x slower
pnpm 11
2.96s6.7x slower
pnpm 12
911ms2.1x slower
pnpm 12 + pnpr
729ms1.7x slower
pnpm 12 + global store
440ms
pnpm 12 hoisted
793ms1.8x slower
cache + lockfileReinstalling a project you already have.
npm
4.79s28x slower
pnpm 11
1.77s10x slower
pnpm 12
747ms4.4x slower
pnpm 12 + pnpr
789ms4.6x slower
pnpm 12 + global store
170ms
pnpm 12 hoisted
554ms3.3x slower
everything warmRunning install when nothing changed.
npm
669ms45x slower
pnpm 11
398ms27x slower
pnpm 12
16ms1.1x slower
pnpm 12 + pnpr
15ms
pnpm 12 + global store
47ms3.1x slower
pnpm 12 hoisted
15ms
updateA dependency was bumped in package.json.
npm
2.98s3.9x slower
pnpm 11
2.74s3.5x slower
pnpm 12
807ms
pnpm 12 + pnpr
773ms
pnpm 12 + global store
813ms1.1x slower
pnpm 12 hoisted
1.03s1.3x slower

Total across all scenarios

  1. pnpm 12 + pnpr7.29sfastest
  2. pnpm 12 + global store9.52s1.3x slower
  3. pnpm 1210.2s1.4x slower
  4. pnpm 12 hoisted10.6s1.5x slower
  5. pnpm 1119.5s2.7x slower
  6. npm1m 9s9.5x slower

All 6 scenarios added up.

Total across all scenarios with usage weights

  1. pnpm 12 + global store16.3sfastest
  2. pnpm 12 + pnpr18.3s1.1x slower
  3. pnpm 12 hoisted21.5s1.3x slower
  4. pnpm 1222.3s1.4x slower
  5. pnpm 1148.7s3.0x slower
  6. npm2m 20s8.6x slower

A typical mix of 20 installs during local development, where the cache is rarely cold: 8× cache + lockfile, 4× cache, 3× everything warm, 2× lockfile, 2× update, 1× clean.

Exact numbers

Install Speed on alotta-files — fastest run per scenario.
Scenarionpmv12.2.2pnpm 11v11.28.9pnpm 12v12.19.0pnpm 12 + pnprv12.19.0pnpm 12 + global storev12.19.0pnpm 12 hoistedv12.19.0
cleanA fresh clone. Nothing cached.43.2s7.26s4.44s2.50s4.72s4.57s
lockfileCI, first install.10.4s4.41s3.30s2.48s3.33s3.62s
cacheReinstalling without a lockfile.7.46s2.96s911ms729ms440ms793ms
cache + lockfileReinstalling a project you already have.4.79s1.77s747ms789ms170ms554ms
everything warmRunning install when nothing changed.669ms398ms16ms15ms47ms15ms
updateA dependency was bumped in package.json.2.98s2.74s807ms773ms813ms1.03s
Measured with npm 12.2.2 · pnpm 11 11.28.9 · pnpm 12 12.19.0 · pnpm 12 + pnpr 12.19.0 · pnpm 12 + global store 12.19.0 · pnpm 12 hoisted 12.19.0.

alotta-packages

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

6/6scenarios where pnpm beats npm
120xfaster than npm on “everything warm”
16mspnpm's best run — “everything warm”
cleanA fresh clone. Nothing cached.
npm
1m 37s12x slower
pnpm 11
22.6s2.8x slower
pnpm 12
12.7s1.6x slower
pnpm 12 + pnpr
8.05s
pnpm 12 + global store
14.3s1.8x slower
pnpm 12 hoisted
14.2s1.8x slower
lockfileCI, first install.
npm
28.1s3.9x slower
pnpm 11
11.2s1.6x slower
pnpm 12
8.78s1.2x slower
pnpm 12 + pnpr
7.12s
pnpm 12 + global store
8.79s1.2x slower
pnpm 12 hoisted
10.3s1.4x slower
cacheReinstalling without a lockfile.
npm
26.2s22x slower
pnpm 11
10.3s8.9x slower
pnpm 12
2.85s2.4x slower
pnpm 12 + pnpr
2.24s1.9x slower
pnpm 12 + global store
1.17s
pnpm 12 hoisted
2.47s2.1x slower
cache + lockfileReinstalling a project you already have.
npm
14.7s31x slower
pnpm 11
4.35s9.2x slower
pnpm 12
2.05s4.3x slower
pnpm 12 + pnpr
2.23s4.7x slower
pnpm 12 + global store
471ms
pnpm 12 hoisted
1.89s4.0x slower
everything warmRunning install when nothing changed.
npm
1.93s120x slower
pnpm 11
391ms24x slower
pnpm 12
16ms
pnpm 12 + pnpr
20ms1.3x slower
pnpm 12 + global store
83ms5.2x slower
pnpm 12 hoisted
16ms
updateA dependency was bumped in package.json.
npm
12.4s6.6x slower
pnpm 11
8.43s4.5x slower
pnpm 12
2.21s1.2x slower
pnpm 12 + pnpr
1.88s
pnpm 12 + global store
2.26s1.2x slower
pnpm 12 hoisted
2.88s1.5x slower

Total across all scenarios

  1. pnpm 12 + pnpr21.5sfastest
  2. pnpm 12 + global store27.0s1.3x slower
  3. pnpm 1228.6s1.3x slower
  4. pnpm 12 hoisted31.7s1.5x slower
  5. pnpm 1157.4s2.7x slower
  6. npm3m 0s8.4x slower

All 6 scenarios added up.

Total across all scenarios with usage weights

  1. pnpm 12 + global store45.1sfastest
  2. pnpm 12 + pnpr52.9s1.2x slower
  3. pnpm 121m 3s1.4x slower
  4. pnpm 12 hoisted1m 6s1.5x slower
  5. pnpm 112m 19s3.1x slower
  6. npm6m 46s9.0x slower

A typical mix of 20 installs during local development, where the cache is rarely cold: 8× cache + lockfile, 4× cache, 3× everything warm, 2× lockfile, 2× update, 1× clean.

Exact numbers

Install Speed on alotta-packages — fastest run per scenario.
Scenarionpmv12.2.2pnpm 11v11.28.9pnpm 12v12.19.0pnpm 12 + pnprv12.19.0pnpm 12 + global storev12.19.0pnpm 12 hoistedv12.19.0
cleanA fresh clone. Nothing cached.1m 37s22.6s12.7s8.05s14.3s14.2s
lockfileCI, first install.28.1s11.2s8.78s7.12s8.79s10.3s
cacheReinstalling without a lockfile.26.2s10.3s2.85s2.24s1.17s2.47s
cache + lockfileReinstalling a project you already have.14.7s4.35s2.05s2.23s471ms1.89s
everything warmRunning install when nothing changed.1.93s391ms16ms20ms83ms16ms
updateA dependency was bumped in package.json.12.4s8.43s2.21s1.88s2.26s2.88s
Measured with npm 12.2.2 · pnpm 11 11.28.9 · pnpm 12 12.19.0 · pnpm 12 + pnpr 12.19.0 · pnpm 12 + global store 12.19.0 · pnpm 12 hoisted 12.19.0.
  • 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
26xfaster than nvm on “install (warm store)”
7mspnpm's best run — “run in project”
install (clean)Install Node.js 24, nothing cached.
pnpm
1.73s
fnm
2.98s1.7x slower
nvm
2.21s1.3x slower
install (warm store)Install a version you had before.
pnpm
76ms
fnm
2.95s39x slower
nvm
1.99s26x slower
run in projectRun node in a project pinned to Node.js 22.
pnpm
7ms1.4x slower
fnm
5ms
nvm
49ms10x slower

Total across all scenarios

  1. pnpm1.82sfastest
  2. nvm4.25s2.3x slower
  3. fnm5.94s3.3x slower

All 3 scenarios added up.

Exact numbers

Node.js Version Management — fastest run per scenario.
Scenariopnpmv12.19.0fnmv1.39.0nvmv0.41.0
install (clean)Install Node.js 24, nothing cached.1.73s2.98s2.21s
install (warm store)Install a version you had before.76ms2.95s1.99s
run in projectRun node in a project pinned to Node.js 22.7ms5ms49ms
Measured with pnpm 12.19.0 · fnm 1.39.0 · nvm 0.41.0.
  • 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.