/minification-benchmarks

🏃‍♂️🏃‍♀️🏃 JS minification benchmarks: babel-minify, esbuild, terser, uglify-js, swc, google closure compiler, tdewolff/minify

Primary LanguageTypeScriptMIT LicenseMIT

🏃‍♂️🏃‍♀️🏃 JS minification benchmarks

This repo is routinely maintained to compare the quality and speed across the latest versions of the following JavaScript minifiers:

Benchmarks last updated on May 7, 2022.

Support this project by ⭐️ starring and sharing it. Follow me to see what other cool projects I'm working on! ❤️

🙋‍♂️ Why?

  1. To help you pick a minifier that fits your needs
  2. To promote JS minifiers and document their performances
  3. To encourage healthy competition and improvement amongst minifiers

👟 Methodology

  • Each minifier is executed in its own process with a 20 second timeout
  • Artifact integrity is verified by a test before and after minification
  • Minifier upgrade PRs are automated via WhiteSource Renovate
  • Benchmarks are gathered on every PR via GitHub Actions (verifiable minified artifacts are uploaded on each run)

⏱ Metrics

Minifiers are ranked by smallest minzipped size.

Minified size

Size of the minified output.

Minzipped size

Size of the minified output with Gzip compression.

For minifiers, this measures how compressable the output is.

For users, this measures network transfer size, which is usually the metric that matters most.

Time

How long minification took (average of 5 runs). Each time is annotated with a multiplier relative to the fastest minifier.

📋 Results

Artifact Original size Gzip size
react v17.0.2 (Source) 72.14 kB 19.41 kB
Minifier Minified size Minzipped size Time
google-closure-compiler -68% 22.83 kB 🏆-58% 8.17 kB 303x 3,527 ms
uglify-js 🏆-68% 22.75 kB -58% 8.22 kB 59x 696 ms
swc -68% 22.98 kB -57% 8.27 kB 2x 24 ms
terser -68% 23.12 kB -57% 8.29 kB 28x 336 ms
babel-minify -67% 23.60 kB -57% 8.43 kB 80x 939 ms
esbuild -67% 23.70 kB -56% 8.53 kB 1x 18 ms
uglify-js.no-compress -65% 25.03 kB -55% 8.65 kB 10x 125 ms
tdewolff-minify -67% 23.61 kB -55% 8.69 kB 🏆 12 ms
terser.no-compress -65% 25.08 kB -55% 8.72 kB 13x 152 ms

Artifact Original size Gzip size
moment v2.29.1 (Source) 173.90 kB 36.15 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 57.96 kB 🏆-49% 18.44 kB 112x 1,649 ms
terser -66% 59.06 kB -49% 18.53 kB 62x 917 ms
google-closure-compiler -66% 58.27 kB -48% 18.75 kB 291x 4,288 ms
swc -66% 58.77 kB -48% 18.87 kB 4x 60 ms
babel-minify -66% 59.70 kB -47% 19.02 kB 155x 2,289 ms
esbuild -66% 59.83 kB -47% 19.25 kB 1x 27 ms
uglify-js.no-compress -64% 62.50 kB -46% 19.44 kB 21x 318 ms
terser.no-compress -64% 63.15 kB -46% 19.56 kB 24x 361 ms
tdewolff-minify -66% 59.95 kB -46% 19.62 kB 🏆 15 ms

Artifact Original size Gzip size
jquery v3.5.1 (Source) 287.63 kB 84.37 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-69% 88.60 kB 🏆-63% 30.87 kB 101x 2,433 ms
terser -69% 89.88 kB -63% 30.93 kB 51x 1,248 ms
uglify-js.no-compress -67% 94.08 kB -63% 31.44 kB 18x 445 ms
terser.no-compress -67% 94.55 kB -63% 31.59 kB 20x 493 ms
babel-minify -68% 92.10 kB -62% 31.75 kB 146x 3,532 ms
swc -69% 89.38 kB -62% 31.84 kB 4x 114 ms
esbuild -69% 90.07 kB -62% 31.89 kB 1x 38 ms
tdewolff-minify -69% 89.91 kB -62% 31.98 kB 🏆 24 ms
google-closure-compiler -68% 92.70 kB -61% 32.98 kB 198x 4,770 ms

Artifact Original size Gzip size
vue v2.6.12 (Source) 342.15 kB 89.52 kB
Minifier Minified size Minzipped size Time
terser -66% 116.77 kB 🏆-52% 42.83 kB 52x 1,559 ms
uglify-js 🏆-67% 114.21 kB -52% 42.90 kB 106x 3,139 ms
babel-minify -66% 117.90 kB -51% 43.83 kB 139x 4,122 ms
swc -65% 118.14 kB -51% 44.01 kB 5x 151 ms
google-closure-compiler -66% 115.60 kB -51% 44.05 kB 194x 5,736 ms
esbuild -65% 118.16 kB -51% 44.25 kB 1x 47 ms
uglify-js.no-compress -63% 126.14 kB -50% 44.36 kB 17x 509 ms
terser.no-compress -63% 126.58 kB -50% 44.57 kB 21x 625 ms
tdewolff-minify -65% 118.15 kB -50% 44.79 kB 🏆 30 ms

Artifact Original size Gzip size
lodash v4.17.21 (Source) 544.10 kB 96.40 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-87% 68.60 kB 🏆-74% 24.61 kB 86x 2,590 ms
google-closure-compiler -86% 73.47 kB -74% 24.84 kB 178x 5,361 ms
terser -87% 71.09 kB -74% 25.06 kB 46x 1,398 ms
babel-minify -87% 72.37 kB -74% 25.37 kB 108x 3,272 ms
swc -87% 70.00 kB -74% 25.47 kB 4x 133 ms
uglify-js.no-compress -86% 74.61 kB -73% 25.76 kB 16x 485 ms
esbuild -87% 72.49 kB -73% 26.06 kB 1x 57 ms
terser.no-compress -86% 75.67 kB -73% 26.10 kB 18x 544 ms
tdewolff-minify -87% 72.44 kB -72% 26.75 kB 🏆 30 ms

Artifact Original size Gzip size
d3 v6.3.1 (Source) 555.77 kB 129.99 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-52% 264.38 kB 🏆-33% 86.84 kB 102x 5,805 ms
terser -52% 267.99 kB -33% 87.66 kB 56x 3,205 ms
uglify-js.no-compress -50% 275.35 kB -32% 88.30 kB 16x 953 ms
swc -52% 266.71 kB -32% 88.81 kB 8x 496 ms
terser.no-compress -50% 276.47 kB -32% 88.99 kB 23x 1,310 ms
esbuild -51% 270.18 kB -30% 90.42 kB 1x 82 ms
tdewolff-minify -51% 269.95 kB -30% 90.70 kB 🏆 57 ms
google-closure-compiler -51% 270.30 kB -28% 93.48 kB 130x 7,408 ms
babel-minify Failed to minify

Artifact Original size Gzip size
terser v5.13.1 (Source) 952.33 kB 182.00 kB
Minifier Minified size Minzipped size Time
terser -54% 437.16 kB 🏆-35% 117.58 kB 43x 2,806 ms
uglify-js -55% 432.13 kB -35% 117.61 kB 77x 5,006 ms
terser.no-compress -53% 451.95 kB -35% 118.51 kB 18x 1,199 ms
uglify-js.no-compress -53% 449.73 kB -35% 118.59 kB 15x 1,019 ms
tdewolff-minify -54% 435.60 kB -34% 119.56 kB 🏆 64 ms
google-closure-compiler 🏆-56% 419.42 kB -34% 119.87 kB 105x 6,760 ms
esbuild -54% 437.76 kB -34% 120.30 kB 1x 95 ms
swc -47% 509.15 kB -30% 127.81 kB 9x 620 ms
babel-minify Failed to minify

Artifact Original size Gzip size
three v0.124.0 (Source) 1.25 MB 247.75 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-48% 642.78 kB 🏆-36% 158.27 kB 108x 9,093 ms
terser -48% 653.38 kB -36% 158.57 kB 46x 3,871 ms
swc -48% 648.92 kB -35% 160.76 kB 7x 604 ms
babel-minify -48% 648.83 kB -35% 161.70 kB 169x 14,247 ms
google-closure-compiler -48% 644.45 kB -35% 161.84 kB 131x 10,995 ms
uglify-js.no-compress -46% 674.49 kB -35% 162.17 kB 16x 1,403 ms
terser.no-compress -46% 675.60 kB -34% 162.35 kB 19x 1,660 ms
esbuild -48% 646.78 kB -34% 162.65 kB 2x 206 ms
tdewolff-minify -48% 648.01 kB -33% 165.05 kB 🏆 84 ms

Artifact Original size Gzip size
victory v35.8.4 (Source) 2.14 MB 309.06 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 704.12 kB 🏆-49% 157.61 kB 83x 9,020 ms
terser -66% 715.74 kB -49% 158.16 kB 50x 5,468 ms
swc -67% 712.84 kB -47% 164.18 kB 9x 989 ms
terser.no-compress -64% 759.34 kB -46% 165.72 kB 20x 2,218 ms
uglify-js.no-compress -65% 756.53 kB -46% 166.88 kB 17x 1,926 ms
tdewolff-minify -66% 719.30 kB -45% 170.41 kB 🏆 108 ms
google-closure-compiler -67% 705.87 kB -44% 174.20 kB 141x 15,293 ms
esbuild -66% 724.21 kB -42% 179.79 kB 2x 300 ms
babel-minify Failed to minify

Artifact Original size Gzip size
echarts v5.1.1 (Source) 3.20 MB 683.47 kB
Minifier Minified size Minzipped size Time
terser -69% 1.00 MB 🏆-53% 321.26 kB 43x 8,153 ms
uglify-js 🏆-69% 981.52 kB -52% 326.38 kB 82x 15,644 ms
swc -69% 1.00 MB -52% 326.64 kB 11x 2,139 ms
terser.no-compress -66% 1.07 MB -52% 329.73 kB 19x 3,775 ms
uglify-js.no-compress -67% 1.07 MB -52% 330.46 kB 12x 2,393 ms
esbuild -68% 1.01 MB -52% 330.87 kB 1x 364 ms
tdewolff-minify -68% 1.01 MB -51% 336.42 kB 🏆 189 ms
babel-minify Timed out
google-closure-compiler Timed out

Artifact Original size Gzip size
antd v4.16.1 (Source) 6.69 MB 825.74 kB
Minifier Minified size Minzipped size Time
uglify-js 🏆-67% 2.23 MB 🏆-45% 454.80 kB 63x 15,397 ms
terser -66% 2.25 MB -44% 458.50 kB 37x 9,005 ms
swc -66% 2.25 MB -44% 464.23 kB 11x 2,660 ms
terser.no-compress -64% 2.43 MB -42% 476.68 kB 16x 4,072 ms
uglify-js.no-compress -64% 2.42 MB -42% 479.73 kB 14x 3,586 ms
tdewolff-minify -66% 2.30 MB -41% 483.92 kB 🏆 241 ms
esbuild -66% 2.31 MB -41% 488.11 kB 2x 593 ms
babel-minify Timed out
google-closure-compiler Timed out

Artifact Original size Gzip size
typescript v4.6.4 (Source) 10.09 MB 1.77 MB
Minifier Minified size Minzipped size Time
uglify-js.no-compress -67% 3.33 MB 🏆-53% 828.15 kB 9x 7,153 ms
terser.no-compress -67% 3.32 MB -53% 831.17 kB 10x 8,364 ms
tdewolff-minify 🏆-69% 3.18 MB -53% 837.72 kB 1x 926 ms
esbuild -67% 3.28 MB -51% 863.80 kB 🏆 790 ms
babel-minify Timed out
google-closure-compiler Timed out
swc Invalid output: TypeError
terser Timed out
uglify-js Timed out

Want to see more projects listed? PRs welcome! See the contribution guide for more info.

🥇 Results

Best minification performance

UglifyJS takes first place for the smallest uncompressed minified size for all races, and wins 9 out of 11 races for minzipped size! Impressively, it's still written in ES5 but can handle ES6 up to ES2020.

Terser takes a very close second, only short by at most by 1% in minzipped size while performing twice as fast as Uglify! Terser is a fork of UglifyJS and comes with support for ES6+.

Fastest minifier

esbuild runs 10x+ laps around everyone else! The Go-lang JS minifier/bundler is a beast of its own. Not only is it insanely fast, but demonstrates very competitive minification abilities, usually performing closely to Terser while supporting cutting-edge ESNext syntax. However, note that esbuild has a limited set of optimizations and there are currently no plans to improve it.

⚡️ Pro Tip: Harness the speed of esbuild in your Webpack build for minification (and even transpilation) with esbuild-loader.

Definitely keep an eye out for swc, the JS compiler written in Rust. It's also blazing fast and rumor has it they're stepping up their minification.