# Benchmarks — SPB Git 1.1.0 → 2.0.0 All numbers measured on 2026-11-01 with Playwright Chromium. "Mobile" = 375×812, CPU ×4 slowdown, 1.6 Mb/s / 150 ms RTT. "Desktop" = 1440×900, no throttling. CLS was 0 on every page in both versions. ## A. Production baseline (1.1.0 on M1M32 behind the tunnel, gzip at the edge) | Page | Mobile LCP | Mobile TTFB | Desktop LCP | HTML (gz) | CSS (gz) | JS (gz) | Fonts | |---|---|---|---|---|---|---|---| | `/` (157 repos) | 1 216 ms | 182 ms | 320 ms | 34.0 KB | 18.7 KB | 9.0 KB | 208.8 KB (5 files) | | `/spbgit` | 276 ms | 144 ms | 236 ms | 9.7 KB | — | — | — | | blob `src/server.mjs` | 552 ms | 424 ms | 328 ms | 13.2 KB | — | — | — | | commit `810e402` (60 files) | 1 612 ms | **1 463 ms** | 1 336 ms | 120.6 KB | — | — | — | Server, warm: `/` 64 ms · repo 58 ms · `/api/v1/repos` 10 ms. PM2: 2 861 memory restarts, RSS peaks 0.9–2.1 GB, 599 MB request log. ## B. Local A/B — same machine, same 9-repo dev dataset, warm caches 1.1.0 ran from a git worktree (`810e402`) on port 7422, 2.0.0 on 7421. 1.1.0 has no in-process compression (production relies on the edge); 2.0.0 compresses in-process (brotli q4). Column "wire" is what the browser transferred. | Page | Version | Mobile LCP | Mobile DCL | Desktop LCP | Wire HTML | Server avg (10 req) | |---|---|---|---|---|---|---| | `/` | 1.1.0 | 1 632 ms | 1 685 ms | 144 ms | 98.3 KB (raw) | 7 ms | | `/` | **2.0.0** | **1 572 ms** | **882 ms** | **48 ms** | **12.6 KB (br)** | **3 ms** | | `/spbgit` | 1.1.0 | 568 ms | 673 ms | 88 ms | 43.6 KB | 37 ms | | `/spbgit` | **2.0.0** | **180 ms** | **221 ms** | **68 ms** | **12.2 KB** | 33 ms | | blob `src/server.mjs` | 1.1.0 | 568 ms | 876 ms | 172 ms | 102.9 KB | 105 ms | | blob `src/server.mjs` | **2.0.0** | **188 ms** | **241 ms** | 168 ms | **14.1 KB** | 116 ms | | commit `810e402` | 1.1.0 | 1 132 ms | 15 267 ms | 868 ms | 3 004.9 KB | 679 ms | | commit `810e402` | **2.0.0** | **220 ms** | **697 ms** | **168 ms** | **55.1 KB** | **44 ms** | | commits list | 1.1.0 | 600 ms | 715 ms | 136 ms | 46.9 KB | 73 ms | | commits list | **2.0.0** | **220 ms** | **216 ms** | 124 ms | **10.0 KB** | 77 ms | Static assets over the wire (brotli): tokens.css 3.2 KB, app.css 12.3 KB, markdown.css 1.8 KB, app.js 10.3 KB, theme-boot.js 0.5 KB. Fonts 186 KB (4 preloaded woff2 files; Instrument Serif dropped). Cold cache (first home request after wiping the cache): 1.1.0 304 ms, 2.0.0 381 ms for 9 repositories (2.0 also computes research signals and ref stamps). Production will take ~10 s once after deploy for 157 repositories. ## C. Why the commit page changed so much 1.1.0 highlighted every hunk on every request (679 ms server time) and shipped all 60 files (3.0 MB raw). 2.0.0 caches the prepared diff per sha (`commit-v3.json`), renders files until a 1 500-line page budget and defers the rest behind "Load diff" / "Load all files" (`?all=1`, 1.8 MB raw / 70 KB br), and compresses in-process. ## D. Memory 2.0.0 idle after the QA runs: RSS 313 MB, heap 89 MB (`/healthz`). The 1.1.0 production process reached 750 MB+ within minutes of crawler traffic on `/raw` and blob pages; 2.0.0 streams those (3 MB test binary: exact bytes, `Content-Length` from `cat-file -s`, no buffer) and caps git at 12 processes. Production confirmation of the restart count is part of the post-deploy verification in `docs/DEPLOY.md`. ## E. Budgets (75th percentile, representative mobile) Targets from the directive: LCP ≤ 2.5 s, INP ≤ 200 ms, CLS ≤ 0.1. Local results meet LCP and CLS on every page; INP is not measurable without real interaction traces — the interactive surfaces (palette, sheets, copy, tree) run no layout-thrashing work and were manually exercised on the throttled profile without visible lag. Re-measure on production after deployment with the same `scripts/qa` recipes (see `docs/SPBGIT-2-PROGRESS.md` Phase 7).