[HN Gopher] JavaScript Minification Benchmarks
       ___________________________________________________________________
        
       JavaScript Minification Benchmarks
        
       Author : wagslane
       Score  : 46 points
       Date   : 2021-02-06 17:49 UTC (5 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | Xevi wrote:
       | I wonder why SWC is so far behind the rest in terms of minified
       | size. Kinda makes me not want to use it to be honest. Maybe
       | there's some low hanging problems to tackle to make it better?
        
       | kaleidawave wrote:
       | Awesome benchmarks. Would be interesting how much minification
       | affects actual client and server performance?
       | 
       | And as understand all these tools use a lexing and ast parsing
       | stage. It would be interesting if you could build a very simple
       | minifier (at least a whitespace one) that could skip that step
       | through just working on input buffer?
       | 
       | There is also the fact that more code means longer minification
       | time. You can praise esbuild for building a CRA in 2 seconds but
       | there are workflows/frameworks that compile sub second by using
       | less runtime code.
        
       | bumbledraven wrote:
       | Wow, esbuild comes away as the clear winner overall. It's always
       | the fastest -- often at least 10x as fast as many of the others -
       | and its compression ratio was within 2% or so of the best in all
       | cases.
        
         | bastawhiz wrote:
         | I'm very bullish on esbuild. But in testing with my own app, it
         | produces output 8-12% bigger than the same files processed with
         | terser. I would bet that it's a small number of optimizations
         | that are missing that benefit codebases like mine (JSX-heavy).
         | 
         | My biggest frustration is that I am not nearly as skilled in Go
         | as I am in other languages, and don't have the confidence
         | jumping into a large existing Go codebase than I would with
         | JS/TS/etc. I have the same issue with Flow, which is written in
         | OCaml.
        
         | capableweb wrote:
         | > clear winner overall. It's always the fastest
         | 
         | If you're mostly worried about how quickly you can minify when
         | you do minify, then you're worrying about the wrong thing. You
         | want as small results as possible that can be executed the
         | fastest, how long time it takes doesn't really matter as you
         | only minify on delivery to end-users, not every time you make a
         | change locally.
         | 
         | So instead it seems Google Closure is the best, in the cases
         | the author got it to work. Otherwise it's UglifyJS/Terser,
         | depending on your needs.
        
           | randomfool wrote:
           | Working on codebases where the compilation times can often be
           | 30-60s, a 10x improvement makes a massive difference in
           | development flow and is definitely worth a 2% regression in
           | size. It's the difference between being multi-tasking while
           | compiling and not.
           | 
           | Of course you could use esbuild for dev and terser for prod,
           | but maintaining two may be a support headache.
        
             | [deleted]
        
             | danappelxx wrote:
             | When would you need to minify in dev?
        
           | wgjordan wrote:
           | > If you're mostly worried about how quickly you can minify
           | when you do minify, then you're worrying about the wrong
           | thing.
           | 
           | You don't need to be 'mostly' worried about how quickly you
           | can minify for esbuild to be the top choice- if you're only,
           | say, 10% worried about build times and still 90% ('mostly')
           | worried about size + execution speed, esbuild still comes out
           | on top from these benchmarks.
        
             | capableweb wrote:
             | Or, put in another way: If you're are 10% worried about
             | that you get to do production deploys 10% faster and 90%
             | worried about how fast you can deliver the code to your
             | users when they load your site (and/or bandwidth costs that
             | increases with each user), then esbuild might make more
             | sense for you.
             | 
             | For the rest of us that are 100% focused on the best
             | experience for our users, we stick with the tools that does
             | the best minification while being a bit slower, and throw
             | more hardware at it if needed for the deploys.
        
               | yoz-y wrote:
               | If you can do 10x the builds in a day, you can end up
               | catching more issues before your users. Meanwhile the
               | difference for them is in single digit percents.
               | Interesting test to do next would be how performant are
               | the compiled versions.
        
               | Griffinsauce wrote:
               | > throw more hardware at it
               | 
               | And pay more. ESBuild is so much faster that I imagine it
               | could have a significant impact on costs.
               | 
               | Besides, yes you make a good point about the size savings
               | scaling with users, but development speed compounds
               | changes over time.
               | 
               | The choice is a bit more nuanced than "smaller build
               | always === 100% focused on the best experience"
        
           | shirakawasuna wrote:
           | A 2% difference is pretty small, though. Small enough that
           | the top four or so minifiers appeared to have very similar
           | performance - just depended on which codebase you were using.
           | If you're picking a minifier, I'd definitely go with esbuild
           | given that it falls in that 'top of the pack' group and is
           | vastly vaster.
           | 
           | If someone were only interested in the smallest possible
           | minified size, the appropriate solution would be to use all
           | of these minifiers every time and choose the smallest result.
        
           | mschuetz wrote:
           | No, I vastly prefer 10x faster build times and merely 2% file
           | sizes over anything that's on order of magnitude slower. It's
           | not even a competition.
        
             | cj wrote:
             | Of course developers prefer faster build times. But what do
             | the end-users who you write code for prefer? (Especially in
             | a typical CI/CD environment where developers often don't
             | need to monitor and wait for builds to finish)
             | 
             | 2% sounds small. And it is, if your traffic is small. It's
             | not small when you have millions of users.
        
               | jahewson wrote:
               | End users prefer that we ship the features and squash the
               | bugs they care about, which can be done faster with
               | shorter build cycles. Our webpack prod build, which we
               | have to run as sometimes minifying breaks things, takes 6
               | minutes. It's the longest build step we have.
        
               | mschuetz wrote:
               | It's tiny, and usually negligible in context with all the
               | other data that needs to be transferred, even with
               | millions of users. Millions of users might be the
               | situation where I'd start thinking of integrating slower
               | builds as an alternative, provided they can seamlessly
               | live side-by-side with the fast build tools.
        
               | jakear wrote:
               | Why would end users don't care if there are a million
               | other people getting a bit larger download size..?
               | Accounts payable might care, but they aren't end users.
        
               | cj wrote:
               | 2% file size reduction is probably an over optimization
               | for a new startup searching for their first users.
               | 
               | But for an established product with substantial traffic,
               | swapping out a js minifier for one that achieves even
               | single digit % compression improvement seems worthwhile
               | to me - if the only downside is adding a few extra
               | seconds to build time.
        
           | [deleted]
        
           | Griffinsauce wrote:
           | > how long time it takes doesn't really matter
           | 
           | It might be a bit of a red herring but build (and thus
           | deploy) times absolutely do matter.
           | 
           | Going from a 30 second deploy to a 2 minute deploy to a 30
           | minute deploy has severe impact on your workflow, how atomic
           | your changes can be and how immediate your feedback loop is.
           | 
           | I think (without data but from my own experience) it's one of
           | the most massive underlooked productivity-sinks especially in
           | web.
        
             | FriedrichN wrote:
             | I don't know about you but I don't minify my code when I'm
             | working on it, only when I'm deploying it for final testing
             | and production.
             | 
             | I don't see a reason, but maybe there is one.
        
               | yoz-y wrote:
               | I definitely started to also run tests on minified code
               | and found bugs in compilers that I had to work around.
        
             | goeiedaggoeie wrote:
             | You would also develop and deploy against closure using
             | simple for your dev workflow and only run advanced more
             | infrequently. Advanced also gives deeper type schecking. I
             | have not worked with closure compiler in years, but it is a
             | different and incredibly powerful beast. Easily extendible
             | with your own compile passes as well
        
             | capableweb wrote:
             | True and I agree with you, fast deploys are one of the most
             | massively underlooked productivity-sinks. Minification
             | tends to be the slowest step in a frontend pipeline (at
             | least in my experience) but it's closer to a two minute
             | step with Google Closure Compiler on a small-size codebase
             | (+20K LoC) than 30 minutes, and the size difference is more
             | important (for us) than the difference between seconds when
             | deploying.
        
               | noahtallen wrote:
               | I disagree only because a large e2e test suite can be
               | very long. I often see 20-30 minute e2e suites for large
               | applications. Applications which compile in a few
               | minutes.
               | 
               | Totally agree re: deploy being very important to
               | optimize.
        
             | jontro wrote:
             | Why would you minify it at all if so? The fastest would be
             | no minification
        
               | dwohnitmok wrote:
               | The point is that the two are competing priorities. You
               | still care about minimizing end user download size, but
               | you also care about your own developer experience (and
               | concomitant velocity).
               | 
               | Different people may weight those things differently, but
               | it is unlikely that someone would assign a weight of zero
               | to one or the other (so people are unlikely to just throw
               | up their hands and say "no minification").
        
       | franciscop wrote:
       | I found esbuild a few months ago and... never gonna use a
       | different one when doing things manually, the speed different is
       | abyssal. It takes two orders of magnitude lower than the
       | alternatives as shown in these benchmarks.
       | 
       | On the other hand, with Node.js supporting native import/export,
       | I also find myself bundling+minifying the code less and less.
       | Just wish Create-React-App started using it, since I cannot be
       | bothered to dig there enough to manually set it up (the goal of
       | me using CRA is to avoid manual config).
        
       | BiteCode_dev wrote:
       | Not exactly apples to apples, but I'd like to plug in Vite:
       | https://github.com/vitejs/vite
       | 
       | Not that it makes fast minification (which I don't care that much
       | about, I minify only on deploy, and it's a small % of the time it
       | takes), but it does allow for a very fast workflow in dev mode:
       | auto reload seems almost instant even with heavy transpiling.
       | 
       | I only mention it because I assume people look at this articles
       | and think about their dev process speed as well.
       | 
       | If you haven't, give it a try: it's from the Vue author, so it's
       | really clean, but works with react as well.
        
         | iimblack wrote:
         | From a first look this seems very similar to Snowpack. I'll
         | have to check it out more to see how they actually compare.
        
       | ianertson wrote:
       | I also made some benchmarks, including my own bundler:
       | 
       | https://www.github.com/sebbekarlsson/fjb/tree/master/benchma...
        
       | capableweb wrote:
       | Seems almost Google Closure (advanced) fails in half of the tests
       | but otherwise wins the tests if it's successful. Seems to early
       | to claim any "winner" here before someone manages to fix the
       | tests.
       | 
       | A comment reads "google-closure-compiler is no longer maintained"
       | but that's completely misleading. Maybe that's why the author
       | didn't bother to fix their config for Google Closure?
        
         | randomfool wrote:
         | Google Closure's advanced optimizations require annotations
         | throughout your codebase- in many codebases it may require
         | significant effort to get this working. When you need that
         | extra optimization it's great but can be a lot of effort
         | otherwise.
         | 
         | I'm most excited about esbuild though and I'm curious how it'll
         | fit into a larger codebase & ecosystem. The author is
         | aggressive about keeping it simple (for good reason!!)- the
         | focus on speed is awesome.
        
           | capableweb wrote:
           | > it may require significant effort to get this working
           | 
           | You're right, the author probably didn't provide externs
           | and/or exports, so the tests fails. It's not really that much
           | of an effort, especially if you're supposed to be testing the
           | tool itself. Considering that the author is already testing
           | libraries that have externs/exports written for them already,
           | just shows the lack of care of the tests.
        
             | newlisper wrote:
             | Google Closure is the best at minification but it's also
             | the worst less pragmatic option for 99% of projects.
        
       | yladiz wrote:
       | Off topic for this, but I've always wondered, why do these tools
       | call this process "minification", not "minimization"?
        
         | austincheney wrote:
         | Because it comes from the word _minify_ , which I believe was
         | created by Douglas Crockford. To my knowledge he created the
         | first minify tool, JSMin, in 2001. He described using that tool
         | as _to minify_.
        
         | lhorie wrote:
         | Because "minimize code" already has another meaning
        
           | capableweb wrote:
           | That's the first time I hear that. I always understood
           | minification and minimization as synonyms. What would
           | minimizing code mean for you?
        
             | lmkg wrote:
             | My parse of "minimizing code" is that it's an approach to
             | _writing_ code, with the goal of writing less code. I would
             | expect it to include things like terse idioms, DRY,
             | preferring data over code, preferring configuration over
             | code, preferring libraries over rolling your own, managing
             | scope, etc. All things about writing _different code_ ,
             | which solves the problem but is not always semantically
             | equivalent.
             | 
             | By contrast, minification is mechanical semantic-preserving
             | syntax transformations done to a completed program after it
             | written.
        
       | evmar wrote:
       | This whole page is weirdly similar to a project I did, for the
       | same purpose:
       | 
       | https://evmar.github.io/js-min-bench/
       | 
       | What I discovered there is that the best minification is one
       | where you just produce an empty file -- it's 0 bytes of output
       | and extremely fast.
       | 
       | And if you say "wait, I have have the additional requirement that
       | you didn't break the code in the original file, obviously!", you
       | then must define what exactly "break" means in that requirement--
       | for example, it could be that some user requires that
       | someFunction().toString().charAt(10) == 'a', in which case even
       | removing whitespace counts as breakage.
       | 
       | You might think the above is just being overly pedantic or
       | pathological, but it demonstrates a principle that actually ends
       | up mattering, which is that you can't evaluate a minifier unless
       | you define what a successful minification even means.
       | Particularly in the case of more advanced transformation.
       | 
       | I went into it more in this post:
       | 
       | http://neugierig.org/software/blog/2019/04/js-minifiers.html
        
         | jiofih wrote:
         | Sorry but what do you mean by "weirdly similar"? It's a
         | benchmark of minifiers against popular libraries, what's the
         | creative part?
        
         | yoz-y wrote:
         | I guess a reasonable requirement for a momifier would be that
         | the test suite passes 100% of tests after minification.
        
       | deanclatworthy wrote:
       | If you've not yet used esbuild for a simple react or typescript
       | project give it a try. It's far far simpler than webpack and
       | ridiculously quicker.
        
       | jacobp100 wrote:
       | I just tried esbuild on a project that was using webpack. Had one
       | bundle go up from 107kb to 111kb, then if I run it through
       | terser, it'll go back down to 109kb. The speed was phenomenal -
       | even when running through the separate terser step, it's so much
       | faster.
        
       ___________________________________________________________________
       (page generated 2021-02-06 23:01 UTC)