ShopperCove
Menu
All writingBlogTopicsCategoriesAboutRSS
Blog
Categories
Observability & SRE62All categories
About

Plate 75

  1. Blog

Turbo vs Lage: 1.97s vs 3.01s Cold Build

Turbo 2.11.7 vs Lage 2.17.0 on a 4-package diamond npm workspace (250k-iter build scripts): cold wall medians 1,974 ms vs 3,007 ms (~1.5x); Turbo warm 4/4 cache hits ~0.50 s; Lage warm ~1.49 s. Lage required git init.

Aditya Challa·5 October 2026·4 min read

Hands-on
On this page
  1. What I tested
  2. Is Turbo faster than Lage on a cold build?
  3. Does Turbo's local cache matter more than the cold gap?
  4. Should you switch from Lage to Turbo?
  5. Sources
  6. Related

I timed Turbo 2.11.7 and Lage 2.17.0 on the same 4-package npm workspace with a diamond task graph: cold build wall medians were 1.97 s for Turbo and 3.01 s for Lage (about 1.5x). After Turbo populated its cache, warm runs hit 4/4 cached tasks in about 0.50 s; Lage warm runs stayed near 1.49 s on this box.

Short answer: pick Turbo if cold and warm local loops matter and you are fine with Turborepo's cache model. Stay on Lage if you already live in that Microsoft pipeline and your graph is git-backed. No affiliate links in this post.

What I tested

  • Machine: 8 vCPU Intel Xeon / 15 GB RAM Linux cloud box, Node 20.19.2 / npm 9.2.0, tested 5 Oct 2026 (about 23:54 to 00:00 IST). Shared box; each cold run deleted .turbo, .lage, package dist folders, and node_modules caches first.
  • Fixture: /workspace/bench-turbo-lage/. Workspaces @bench/a, b, c, d. Graph: a has no deps; b and c depend on a; d depends on b and c. Each build script burns a fixed 250k Math.sqrt loop and writes dist/out.txt.
  • Tools: turbo 2.11.7 via npx turbo run build (--force for cold); lage 2.17.0 via npx lage build (--no-cache for cold). Lage required a git repo (git init + commit) before it would run.
  • Timing: process wall clock via performance.now() around npx. Five interleaved cold pairs. Separate warm series after one seed build per tool.
  • Findings: cold wall medians Turbo 1,974 ms / Lage 3,007 ms. Tool-reported cold medians ~1.47 s / ~2.07 s. Turbo warm cache hits (4/4) ~0.50 s median; Lage warm ~1.49 s.
  • One surprise: Lage refused to start until the fixture was a git repository. Turbo did not need that.
  • Not tested: remote cache (Vercel / Azure), PnP, pnpm/Yarn workspaces, Windows/macOS, affected-only filters on large monorepos, or Nx (covered elsewhere).

Is Turbo faster than Lage on a cold build?

MetricTurbo 2.11.7Lage 2.17.0
Cold wall median (5 runs, caches wiped)1,974 ms3,007 ms
Tool-reported cold median~1.47 s~2.07 s
Warm wall after cache populate~0.50 s (4/4 cached)~1.49 s
Packages / graph4 / diamond4 / diamond

On this fixture, yes for cold. Turbo's wall clock was about 1.5x lower. The work inside each package was identical, so the gap is orchestrator overhead plus scheduling, not the Math.sqrt loop alone.

For the other monorepo runner decision already on this site, see Turbo vs Nx. Recent Turbo point-release notes live in the Turborepo 2.11.7 post.

Does Turbo's local cache matter more than the cold gap?

For day-to-day loops, yes. Once tasks were cached, Turbo returned in about half a second with 4/4 cache hits. Lage's warm series on this box stayed near 1.5 s. If you restart builds constantly while editing one leaf package, that warm number is what you feel.

Who should not treat warm cache as free: CI agents that wipe the workspace every job, or teams without a remote cache. Then you live on the cold ranking again.

Should you switch from Lage to Turbo?

SituationMy pick
npm/pnpm workspace, want fast local cache hitsTurbo
Already on Turborepo remote cache / VercelStay on Turbo
Pipeline already standardized on Lage + git hashesStay on Lage
Need a git repo just to run the task runnerBudget for Lage's git requirement
Comparing against Nx instead of LageRead Turbo vs Nx​

Bottom line: 1.97 s versus 3.01 s cold, plus ~0.50 s Turbo cache hits, is the decision pair for me. Who should not switch yet: large Lage shops where remote cache, custom pipelines, and team muscle memory dwarf a one-second cold gap. For install speed around either tool, see pnpm vs npm vs Bun; for bundler choices inside the packages, see Rspack vs webpack and Vite vs Parcel.

How this was made: I built a 4-package diamond workspace, installed Turbo and Lage on the ShopperCove test box, timed interleaved cold builds and warm cache runs, and kept the JSON; the write-up was drafted with AI help and checked against that output.

Sources

  • https://turbo.build/repo/docs
  • https://www.npmjs.com/package/turbo
  • https://microsoft.github.io/lage/
  • https://www.npmjs.com/package/lage
  • https://github.com/vercel/turborepo
  • https://github.com/microsoft/lage

Related

  • https://www.shoppercove.com/blog/turbo-vs-nx
  • https://www.shoppercove.com/blog/turborepo-2-11-7-sdkroot-oidc-cache-october-2026
  • https://www.shoppercove.com/blog/pnpm-vs-npm-vs-bun
  • https://www.shoppercove.com/blog/rspack-vs-webpack
  • https://www.shoppercove.com/blog/vite-vs-parcel
  • https://www.shoppercove.com/blog/rolldown-vs-rollup
  • https://www.shoppercove.com/blog/knip-vs-depcheck
  • https://www.shoppercove.com/blog/swc-vs-esbuild-babel
turborepolagemonorepobuild toolsperformance benchmarkcachingjavascriptnode.js

Lab evidence

What I found running this

Hands-on on ShopperCove box 5 Oct 2026 ~23:54-00:00 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 20.19.2, npm 9.2.0). Fixture: /workspace/bench-turbo-lage/ — workspaces @bench/a,b,c,d diamond graph; each build writes dist/out.txt after 250k Math.sqrt. Tools: turbo 2.11.7, lage 2.17.0. Cold: wiped .turbo/.lage/dist; 5 interleaved pairs with turbo --force and lage --no-cache; wall medians 1974 ms vs 3007 ms (tool-reported ~1471/~2070 ms). Warm: Turbo 4/4 cached ~0.50 s; Lage ~1.49 s. Lage needed git repository. Raw: /workspace/bench-turbo-lage/res-turbo-lage.json. Not tested: remote cache, PnP, pnpm/Yarn, Windows/macOS, Nx (separate post), large affected filters. No affiliate.

Notes when a lab post goes up

Occasional email for new hands-on reviews. No sequence and no sponsors.

Related links

  • Plate 97

    Turborepo 2.11.7: SDKROOT passthrough and Vercel OIDC cache quieting (2 Oct 2026)

    Turborepo published turbo@2.11.7 on 2 October 2026: SDKROOT passthrough for repository tasks and quieter Vercel OIDC rotation in .env.local cache inputs, on top of 2.11.6 task tags. Upgrade checklist only; no affiliate.

    5 Oct 2026

  • Plate 45

    Should You Leave Depcruise? 679ms Test

    Madge 8.0.0 vs dependency-cruiser 16.10.2 on 116 JS files: median wall 679 ms vs 1122 ms (~1.65x). Both found the same 2 circular dependency groups. Depcruise also reported 120 modules / 193 dependencies.

    5 Oct 2026

  • Plate 74

    Should You Leave Nx? 3378ms vs 1177ms

    Turbo 2.11.7 vs Nx 23.2.1 on 7 packages / 336 JS files: cold median 1177 ms vs 3378 ms (~2.9x). Warm both 7/7 local cache hits (Turbo wall ~138 ms / tool ~16 ms; Nx wall ~668 ms with daemon / tool ~31 ms).

    5 Oct 2026

On this page

  1. What I tested
  2. Is Turbo faster than Lage on a cold build?
  3. Does Turbo's local cache matter more than the cold gap?
  4. Should you switch from Lage to Turbo?
  5. Sources
  6. Related
All writingBlogCategoriesTopicsAboutPrivacyRSS

© 2026 ShopperCove