-
Notifications
You must be signed in to change notification settings - Fork 51
Is dead code elimination really working? #37
Description
I can't seem to bring the code size down with a barely empty project through dead-code elimination alone, even when following the installation instructions to the letter.
The template used was reagent-figwheel with only devtools and reagent as dependencies. I've fiddled with the goog.DEBUG flag, and then removed devtools from the :require and :dependencies vectors.
| Type | Size |
|---|---|
:dependencies + :require + goog.DEBUG true |
1.9 MB |
:dependencies + :require + goog.DEBUG false |
1.5 MB |
:dependencies + :require + no mention at all |
1.6 MB |
:dependencies + no :require + no mention at all |
763 KB |
no :dependencies + no :require + no mention at all |
763 KB |
The first two rows followed the instructions from the release notes. There's a single mention of (devtools/install!) within a (when ^boolean js/goog.DEBUG ...) block. The other three had this line removed manually.
Google Closure's shaved 400kb of the build, but that's still a 800kb increase for a :require without a single mention of devtools! Is this the best I can expect from dead code elimination?
Here's the code used for the builds (e.g. lein new reagent-figwheel +devtools):
;##################
;### profile.cljs
(defproject devtools-dce "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.9.229"]
[reagent "0.6.0"]
[binaryage/devtools "0.8.2"]]
[...]
:cljsbuild
{:builds
[{:id "min"
:source-paths ["src/cljs"]
:compiler {:main devtools-dce.core
:optimizations :advanced
:output-to "resources/public/js/compiled/app.js"
:output-dir "resources/public/js/compiled/min"
:closure-defines {goog.DEBUG false}
:pseudo-names true ;; added to exacerbate size difference
:pretty-print false}}
]})
;##############
;## core.cljs
(ns devtools-dce.core
(:require
[reagent.core :as reagent]
[devtools.core :as devtools]
))
[...]
(defn dev-setup [] ;; inlining into `main` made no difference
(when ^boolean js/goog.DEBUG
(enable-console-print!)
(println "dev mode")
(devtools/install!)
))
(defn ^:export main []
(dev-setup)
(reload))