Not really helping with the closure compiler but using uglify.js always helped me to squeeze the size a bit more. Have you tried it? When going for size I used these flags `-Oz --llvm-lto 1` and then uglify.js this was usually the best result.
Vilibald On Wed, Jun 24, 2015 at 8:27 PM, Alan deLespinasse <[email protected]> wrote: > I'm trying to compile a fairly straightforward C library into JavaScript so > I can use it in Web applications. I've got it working, but I think it's > larger than it should be. > > The library is basically math functions. I just want to call them and get > their results. They don't do I/O or anything. > > As an example, I'll use the int_sqrt function example from the > documentation: > > > int int_sqrt(int x) { > return sqrt(x); > } > > > Compiling this with -O3 results in an a.out.js file of 143k bytes. I had > thought that -O3 would automatically run the Closure Compiler to do some > minification (vaguely implied by the statement that --closure 0 is the > "default in -O2 and below"), but this doesn't seem to be the case. > > After a bit more research, I settled on this command line: > > emcc -O3 hello_function.cpp --closure 1 -s > EXPORTED_FUNCTIONS="['_int_sqrt']" -s MODULARIZE=1 > > This gets it down to 80k, a huge improvement, but still rather large for > such a tiny input. I tried --closure 2, but (a) that only gets it down to > 77k, and (b) then the code no longer works. I get "Uncaught TypeError: Kc is > not a function" in the console when I try to call it from JavaScript. > > I've seen vague suggestions in various docs that --closure 2 would "require > modifications to the source". I think there may have been something about > requiring Closure type annotations. But that doesn't make sense to me, since > the source code I'm dealing with is C. > > So what's actually needed for --closure 2? > > Also, looking at the generated code, there seems to be a lot of unnecessary > stuff, even with --closure 2. For example, I see standard library stuff like > malloc, free, memset, memcpy, etc. It's true that I might want to call those > functions from my JavaScript code (in fact, for the actual library I'm > trying to use, I do need at least malloc and free), but I thought I would > need to declare such things in the EXPORTED_FUNCTIONS variable. > > Basically what I'm asking is, is it possible to get the compiled code much > smaller? > > If the answer is "that would require more optimization in Emscripten, which > we haven't had time to implement yet", then I'm curious what it would take. > I might consider contributing. (I'm pretty experienced with JavaScript, > though new to Emscripten.) > > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
