minification-benchmarks
minification-benchmarks copied to clipboard
🏃♂️🏃♀️🏃 JS minification benchmarks: babel-minify, esbuild, terser, uglify-js, swc, google closure compiler, tdewolff/minify
🏃♂️🏃♀️🏃 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 Aug 23, 2022.
Support this project by ⭐️ starring and sharing it. Follow me to see what other cool projects I'm working on! ❤️
🙋♂️ Why?
- To help you pick a minifier that fits your needs
- To promote JS minifiers and document their performances
- 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 |
213x 4,503 ms |
uglify-js | 🏆-69% 22.67 kB |
-58% 8.19 kB |
36x 777 ms |
swc | -68% 22.98 kB |
-57% 8.28 kB |
1x 26 ms |
terser | -68% 23.12 kB |
-57% 8.29 kB |
18x 393 ms |
babel-minify | -67% 23.60 kB |
-57% 8.43 kB |
59x 1,252 ms |
esbuild | -67% 23.70 kB |
-56% 8.53 kB |
1x 24 ms |
tdewolff-minify | -67% 23.53 kB |
-56% 8.62 kB |
🏆 21 ms |
uglify-js.no-compress | -65% 25.03 kB |
-55% 8.65 kB |
6x 147 ms |
terser.no-compress | -65% 25.08 kB |
-55% 8.72 kB |
8x 183 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.88 kB |
🏆-49% 18.46 kB |
90x 1,701 ms |
terser | -66% 59.06 kB |
-49% 18.53 kB |
55x 1,051 ms |
google-closure-compiler | -66% 58.27 kB |
-48% 18.75 kB |
249x 4,704 ms |
swc | -66% 58.86 kB |
-48% 18.83 kB |
3x 72 ms |
babel-minify | -66% 59.70 kB |
-47% 19.02 kB |
132x 2,496 ms |
esbuild | -66% 59.83 kB |
-47% 19.25 kB |
1x 35 ms |
tdewolff-minify | -66% 59.94 kB |
-46% 19.42 kB |
🏆 19 ms |
uglify-js.no-compress | -64% 62.50 kB |
-46% 19.44 kB |
16x 314 ms |
terser.no-compress | -64% 63.15 kB |
-46% 19.56 kB |
23x 447 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.55 kB |
🏆-63% 30.86 kB |
60x 2,473 ms |
terser | -69% 89.88 kB |
-63% 30.93 kB |
35x 1,467 ms |
swc | -69% 89.26 kB |
-63% 30.94 kB |
2x 121 ms |
tdewolff-minify | -69% 89.85 kB |
-63% 31.44 kB |
🏆 41 ms |
uglify-js.no-compress | -67% 94.08 kB |
-63% 31.44 kB |
10x 429 ms |
terser.no-compress | -67% 94.55 kB |
-63% 31.59 kB |
14x 596 ms |
babel-minify | -68% 92.10 kB |
-62% 31.75 kB |
96x 3,950 ms |
esbuild | -69% 90.07 kB |
-62% 31.89 kB |
1x 67 ms |
google-closure-compiler | -68% 92.70 kB |
-61% 32.98 kB |
123x 5,069 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 |
40x 1,925 ms |
uglify-js | 🏆-67% 113.99 kB |
-52% 42.87 kB |
65x 3,092 ms |
swc | -66% 116.51 kB |
-52% 42.96 kB |
3x 176 ms |
babel-minify | -66% 117.90 kB |
-51% 43.83 kB |
92x 4,388 ms |
google-closure-compiler | -66% 115.60 kB |
-51% 44.05 kB |
113x 5,394 ms |
esbuild | -65% 118.16 kB |
-51% 44.25 kB |
1x 75 ms |
uglify-js.no-compress | -63% 126.14 kB |
-50% 44.36 kB |
10x 479 ms |
tdewolff-minify | -66% 117.83 kB |
-50% 44.37 kB |
🏆 47 ms |
terser.no-compress | -63% 126.58 kB |
-50% 44.57 kB |
15x 741 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.26 kB |
🏆-75% 24.56 kB |
75x 2,543 ms |
google-closure-compiler | -86% 73.47 kB |
-74% 24.84 kB |
159x 5,379 ms |
terser | -87% 71.09 kB |
-74% 25.06 kB |
46x 1,578 ms |
swc | -87% 70.48 kB |
-74% 25.32 kB |
4x 152 ms |
babel-minify | -87% 72.37 kB |
-74% 25.37 kB |
105x 3,555 ms |
uglify-js.no-compress | -86% 74.61 kB |
-73% 25.76 kB |
13x 444 ms |
esbuild | -87% 72.49 kB |
-73% 26.06 kB |
1x 51 ms |
terser.no-compress | -86% 75.67 kB |
-73% 26.10 kB |
19x 655 ms |
tdewolff-minify | -87% 72.47 kB |
-73% 26.32 kB |
🏆 34 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.08 kB |
🏆-33% 86.81 kB |
67x 5,683 ms |
terser | -52% 267.99 kB |
-33% 87.66 kB |
48x 4,118 ms |
swc | -52% 266.13 kB |
-32% 87.93 kB |
5x 453 ms |
uglify-js.no-compress | -50% 275.35 kB |
-32% 88.30 kB |
11x 986 ms |
terser.no-compress | -50% 276.47 kB |
-32% 88.99 kB |
21x 1,843 ms |
tdewolff-minify | -51% 269.93 kB |
-31% 89.70 kB |
🏆 84 ms |
esbuild | -51% 270.18 kB |
-30% 90.42 kB |
1x 122 ms |
google-closure-compiler | -51% 270.30 kB |
-28% 93.48 kB |
91x 7,752 ms |
babel-minify Failed to minify | — | — | — |
Artifact | Original size | Gzip size | |
---|---|---|---|
terser v5.15.0 (Source) | 958.35 kB |
183.30 kB |
|
Minifier | Minified size | Minzipped size | Time |
uglify-js | -55% 433.57 kB |
🏆-36% 118.14 kB |
94x 5,357 ms |
terser | -54% 439.37 kB |
-35% 118.27 kB |
65x 3,752 ms |
terser.no-compress | -53% 454.26 kB |
-35% 119.13 kB |
28x 1,610 ms |
uglify-js.no-compress | -53% 452.01 kB |
-35% 119.23 kB |
17x 969 ms |
tdewolff-minify | -54% 437.66 kB |
-35% 119.48 kB |
🏆 57 ms |
google-closure-compiler | 🏆-56% 421.60 kB |
-34% 120.55 kB |
128x 7,302 ms |
esbuild | -54% 439.94 kB |
-34% 120.94 kB |
1x 86 ms |
swc | -49% 484.91 kB |
-32% 123.86 kB |
5x 321 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 | 🏆-49% 642.25 kB |
🏆-36% 158.26 kB |
89x 7,253 ms |
terser | -48% 653.38 kB |
-36% 158.57 kB |
68x 5,532 ms |
swc | -48% 644.46 kB |
-36% 158.94 kB |
7x 576 ms |
google-closure-compiler | -48% 644.45 kB |
-35% 161.84 kB |
118x 9,599 ms |
uglify-js.no-compress | -46% 674.49 kB |
-35% 162.17 kB |
17x 1,423 ms |
terser.no-compress | -46% 675.60 kB |
-34% 162.35 kB |
29x 2,393 ms |
esbuild | -48% 646.78 kB |
-34% 162.65 kB |
1x 154 ms |
tdewolff-minify | -48% 644.89 kB |
-34% 163.91 kB |
🏆 81 ms |
babel-minify Timed out | — | — | — |
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% 702.71 kB |
🏆-49% 157.54 kB |
81x 8,955 ms |
terser | -66% 715.74 kB |
-49% 158.16 kB |
72x 7,935 ms |
swc | -67% 711.96 kB |
-48% 160.18 kB |
6x 736 ms |
tdewolff-minify | -66% 718.74 kB |
-47% 164.50 kB |
🏆 109 ms |
terser.no-compress | -64% 759.34 kB |
-46% 165.72 kB |
26x 2,939 ms |
uglify-js.no-compress | -65% 756.53 kB |
-46% 166.88 kB |
16x 1,828 ms |
google-closure-compiler | -67% 705.87 kB |
-44% 174.20 kB |
93x 10,200 ms |
esbuild | -66% 724.21 kB |
-42% 179.78 kB |
1x 195 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 |
41x 12,478 ms |
swc | -69% 1.00 MB |
-53% 323.09 kB |
7x 2,168 ms |
uglify-js | 🏆-69% 980.32 kB |
-52% 326.24 kB |
50x 15,110 ms |
terser.no-compress | -66% 1.07 MB |
-52% 329.73 kB |
19x 5,721 ms |
uglify-js.no-compress | -67% 1.07 MB |
-52% 330.46 kB |
7x 2,297 ms |
esbuild | -68% 1.01 MB |
-52% 330.87 kB |
1x 337 ms |
tdewolff-minify | -68% 1.01 MB |
-52% 331.30 kB |
🏆 301 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.67 kB |
41x 15,216 ms |
terser | -66% 2.25 MB |
-44% 458.50 kB |
39x 14,434 ms |
swc | -66% 2.25 MB |
-44% 460.34 kB |
5x 2,185 ms |
tdewolff-minify | -66% 2.30 MB |
-43% 473.23 kB |
🏆 368 ms |
terser.no-compress | -64% 2.43 MB |
-42% 476.68 kB |
19x 7,121 ms |
uglify-js.no-compress | -64% 2.42 MB |
-42% 479.73 kB |
8x 3,250 ms |
esbuild | -66% 2.31 MB |
-41% 488.10 kB |
1x 525 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 |
8x 6,698 ms |
tdewolff-minify | 🏆-69% 3.17 MB |
-53% 829.76 kB |
1x 942 ms |
terser.no-compress | -67% 3.32 MB |
-53% 831.17 kB |
15x 11,665 ms |
esbuild | -67% 3.28 MB |
-51% 863.80 kB |
🏆 768 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.