ShopperCove
Menu
All writingBlogTopicsCategoriesAboutRSS
Blog
Categories
Observability & SRE62All categories
About

Plate 31

  1. Blog

Should You Leave Rollup? 964ms vs 246ms

Rolldown 1.2.12 vs Rollup 4.64.0 on 501 ESM files (197380 B source): median wall 245.617 ms vs 964.3 ms (~3.9x). Output 130522 vs 126894 B. Direct node bin, 5 interleaved warm runs, no minify.

Aditya Challa·5 October 2026·4 min read

Summary
On this page
  1. What I tested
  2. Is Rolldown faster than Rollup?
  3. What do you lose leaving Rollup?
  4. Should you leave Rollup for Rolldown?
  5. Sources
  6. Related

On a 501-file ESM tree (197,380 bytes of source), Rollup 4.64.0 took a median 964 ms to produce one ES bundle. Rolldown 1.2.12 took 246 ms on the same machine, about 3.9x faster. Same entry, interleaved warm CLI runs, no minify.

Short answer: leave Rollup for Rolldown when library or app bundle time is the pain and you can live without a Rollup plugin that Rolldown does not yet match. Keep Rollup when a plugin, output option, or CI contract still assumes classic Rollup. No affiliate links in this post.

What I tested

  • Machine: 8 vCPU Intel Xeon / 15 GB RAM Linux cloud box, Node 20.19.2, tested 5 Oct 2026 (about 23:00 to 23:10 IST). Shared box; tools interleaved each round.
  • Fixture: 500 generated ESM modules plus a barrel src/index.js (501 files, 197,380 bytes). Modules form a shallow import chain and re-export from the barrel.
  • Tools: rollup 4.64.0 CLI (src/index.js -o dist-rollup.js -f es --silent); rolldown 1.2.12 CLI (src/index.js -o dist-rolldown.js -f esm). Timed via direct node on each package bin (no npx wrapper).
  • Timing: one warmup each, then five interleaved warm runs. Median wall-clock of the full CLI call.
  • Output bytes: Rollup 126,894 B; Rolldown 130,522 B (about 3% larger on this fixture).
  • One surprise: Rolldown was about 3.9x faster, but the Rolldown bundle was larger, not smaller, so speed alone is not a ship-size win.
  • Not tested: tree-shaking quality on a real app, code-splitting / multi-chunk apps, Rollup plugin compatibility matrix, TypeScript input, sourcemaps, watch mode, minify paths, Windows/macOS, Vite's own Rolldown integration.

Is Rolldown faster than Rollup?

ToolMedianRuns (ms)Output bytes
Rolldown 1.2.12246 ms226 / 247 / 225 / 311 / 246130,522
Rollup 4.64.0964 ms964 / 959 / 913 / 973 / 980126,894

On this fixture Rolldown finished about 3.9x faster. Byte totals were close, with Rollup slightly smaller. The leave-Rollup case is strongest when a single-file ES build still costs near a second in CI and your plugin set already works on Rolldown.

If your pain is transform or minify rather than graph bundling, the SWC vs esbuild vs Babel post and the Terser vs esbuild vs SWC minify post are the sibling decisions on this site. Bundler choice for apps is covered in the Rspack vs Webpack post.

What do you lose leaving Rollup?

Rollup's plugin ecosystem and long-stable output options are still the safe default for many library builds. A plugin that only ships a Rollup 3/4 plugin API, or a CI script that asserts exact Rollup chunk names, can block a switch even when the CLI is faster.

Also re-check output size and tree-shaking on your own entry points. Here Rolldown was faster and about 3% larger; your app may flip that. Re-time with the same entry, format, and external list before rewriting the release job.

Should you leave Rollup for Rolldown?

SituationMy pick
Single-file ES/CJS library build still near a second in CITry Rolldown; measure your entry the same way
Already on Vite and waiting for its Rolldown pathFollow Vite's rollout; do not dual-maintain two bundlers
Depends on a Rollup-only plugin or exact chunk contractKeep Rollup until that plugin ships Rolldown support
Need the smallest possible ship bytes on this fixture styleRe-measure; Rollup was slightly smaller here
First PR would only change the bundler binaryFine to trial Rolldown behind a flag

Bottom line: on 501 files, Rollup took 964 ms and Rolldown took 246 ms. Who should not switch yet: teams blocked on a Rollup-only plugin or an output contract Rolldown does not match. Everyone else still paying near a second for a simple ES bundle should measure their own entry the same way.

How this was made: I generated the fixture, ran interleaved Rollup and Rolldown CLI builds on the ShopperCove test box, and kept the timing JSON; the write-up was drafted with AI help and checked against that output.

Sources

  • https://rolldown.rs/
  • https://github.com/rolldown/rolldown
  • https://rollupjs.org/
  • https://www.npmjs.com/package/rolldown
  • https://www.npmjs.com/package/rollup
  • https://vite.dev/

Related

  • https://www.shoppercove.com/blog/swc-vs-esbuild-babel
  • https://www.shoppercove.com/blog/terser-vs-esbuild-swc-minify
  • https://www.shoppercove.com/blog/rspack-vs-webpack
  • https://www.shoppercove.com/blog/vite-8-3-2-renderbuilturl-bundled-dev-sourcemaps-october-2026
  • https://www.shoppercove.com/blog/vite-plus-1-0-unified-toolchain-october-2026
  • https://www.shoppercove.com/blog/webpack-5-111-esm-output-stable-september-2026
  • https://www.shoppercove.com/blog/pnpm-vs-npm-vs-bun
  • https://www.shoppercove.com/blog/turborepo-2-11-7-sdkroot-oidc-cache-october-2026
rolldownrollupbundleresmperformancebuild toolsjavascript

Lab evidence

What I found running this

Hands-on on ShopperCove box 5 Oct 2026 ~23:00-23:10 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 20.19.2). Fixture: 500 generated ESM modules + barrel src/index.js (501 files, 197380 bytes), shallow import chain. Versions: rollup 4.64.0 (CLI src/index.js -o dist-rollup.js -f es --silent); rolldown 1.2.12 (CLI src/index.js -o dist-rolldown.js -f esm). Timed via direct node on package bins (no npx). Wall medians (5 interleaved after warmup): rollup 964.3 ms (964.3/959.079/913.452/972.695/980.354); rolldown 245.617 ms (225.715/247.253/224.618/311.237/245.617). Output bytes: rollup 126894; rolldown 130522 (~3% larger). Raw: /workspace/bench-rolldown/res-rolldown.json. Not tested: tree-shaking quality on a real app, code-splitting, Rollup plugin matrix, TypeScript input, sourcemaps, watch, minify, Windows/macOS, Vite Rolldown integration. No affiliate.

Notes when a lab post goes up

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

Related links

  • Plate 10

    Rspack 2.2.8: resolver cache, memory shrinks, modern-module deferral (28 Sep 2026)

    Rspack published @rspack/core@2.2.8 on 28 September 2026: resolver caching, memory shrinks, and modern-module deferral fixes on the 2.2 line. 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 Terser? 824ms vs 41ms

    Terser 5.51.2 vs esbuild 0.28.2 vs SWC 1.16.13 minify on a 403,418-byte unminified ESM bundle (800 modules): medians 824 ms / 41 ms / 70 ms. Output sizes 219492 / 207619 / 199712 B. Leave Terser if you only need fast minify; keep it for Terser-only compress options.

    5 Oct 2026

On this page

  1. What I tested
  2. Is Rolldown faster than Rollup?
  3. What do you lose leaving Rollup?
  4. Should you leave Rollup for Rolldown?
  5. Sources
  6. Related
All writingBlogCategoriesTopicsAboutPrivacyRSS

© 2026 ShopperCove