Skip to content

perf(pacquet): close the vlt.sh benchmark gap (tracker) #11902

Description

@zkochan

Summary

benchmarks.vlt.sh tracks pacquet (now 0.2.9 ≈ current main) against pnpm 11.3.0 across 8 install variations × 6 fixtures. Two of three original sub-issues landed (#11899, #11901) and one was closed as a debunked diagnosis (#11900). All three retargeted investigations are now fixed on main and waiting for vlt's nightly to pick up the next pacquet release:

Updated chart (2026-05-25)

pacquet 0.2.9 vs pnpm 11.3.0, ratio = pacquet ÷ pnpm. Bold = pacquet slower or DNF.

Variation next astro svelte vue large babylon
cache+lockfile+node_modules 0.08 0.16 0.07 0.12 6.11 DNF
lockfile+node_modules 5.49 10.74 1.98 11.53 9.75 DNF
cache+lockfile 0.17 4.47 0.11 0.73 0.54 DNF
cache 0.26 4.03 0.27 0.46 0.18 DNF
clean 0.44 4.21 0.48 0.88 0.39 DNF
lockfile 0.92 5.50 0.75 1.61 1.56 DNF
node_modules 0.46 3.03 0.46 0.78 0.65 DNF
cache+node_modules 0.15 1.37 0.18 0.21 0.14 DNF

Numbers from benchmarks.vlt.sh/latest/chart-data.json (commit 572a02be63). babylon cells are flagged pacquet_dnf=true in every variation. These numbers predate #11930, #11931, #11934, and #11944 — the babylon column, the lockfile+node_modules row, and the astro column are all expected to collapse once vlt's nightly picks up the next pacquet release.

Status of original sub-issues

Other trackers

Follow-ups from local vlt verification

Local re-bench against pacquet 0.2.10 (comment, investigation) confirmed the astro column collapse but surfaced two residual gaps. Both are tracked as follow-up issues; this issue stays open until they ship and vlt's nightly confirms.

Retargeted work

    • Astro deep-tree perf → fixed by fix(pacquet/registry): deserialize optionalDependencies and peerDependenciesMeta #11934 (pacquet/registry: deserialize optionalDependencies and peerDependenciesMeta). Diagnosis was not in the candidate list — PackageVersion (the type the npm resolver deserializes registry version metadata into) was missing those two fields, so serde_json::to_value(picked) produced a manifest with neither. Downstream, extract_children saw no optionalDependencies edges (astro's sharp got dropped) and extract_peer_dependencies saw no peerDependenciesMeta (every optional peer became "required" and the autoInstallPeers fallback in hoist_peers installed it). On astro that cascaded unstorage's 19 optional peers (@azure/*, @vercel/*, @netlify/blobs, @upstash/redis, ...) plus all their transitives into the install: 1535 resolutions vs pnpm's 377. After fix(pacquet/registry): deserialize optionalDependencies and peerDependenciesMeta #11934 the lockfile shape matches pnpm (377 resolutions, astro@5.18.1(rollup@4.60.4)(typescript@5.9.3) root suffix, sharp present); warm-store install 39.6 s → 8.5 s (4.7× faster, pnpm 7.0 s); warm-cache hyperfine pacquet 670 ms vs pnpm 1.27 s (1.89× faster). See comment for full numbers.

Methodology note

vlt invokes pacquet as pacquet install (no flags), so every variation that wipes the lockfile lands on the fresh-resolve path — currently the least-developed install path (Stage 2 in #11633). pacquet's integrated-benchmark mostly exercises --frozen-lockfile, which is why internal numbers look better than the published vlt chart. Reproduce with:

BENCH_INSTALL_PNPM="corepack pnpm@latest install --ignore-scripts --silent"
BENCH_INSTALL_PACQUET="pacquet install"

Goal

Pacquet ≥ pnpm on every (variation × fixture) cell in the vlt.sh chart. The astro column collapsed cleanly under pacquet 0.2.10. The remaining gap reduces to one follow-up: #11940 (no-op short-circuit ordering). Once that lands and vlt's nightly picks up the resulting release, the chart should show pacquet ahead of pnpm on every cell that previously regressed.


Written by an agent (Claude Code, claude-opus-4-7).

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions