Hi, in TodoMVC Crux version I get a downsize from 838k to 689kb
I can add just these lines: -export-public-symbols=false -prevent-rename-protected-symbols=false -prevent-rename-internal-symbols=false -prevent-rename-public-static-methods=false (trying rename-public-instance-methods break app) Non Crux version: 681kb to 549kb using: -export-public-symbols=false -prevent-rename-protected-symbols=false -prevent-rename-internal-symbols=false -prevent-rename-public-static-methods=false -prevent-rename-public-instance-methods=false So cool this reduced sized! :) El vie, 20 nov 2020 a las 18:47, Carlos Rovira (<carlosrov...@apache.org>) escribió: > Hi Josh, > > thanks for working on this. I finally could get here after weeks of hard > work in other things with almost not time. > I tried in Tour de Jewel with: > > -export-public-symbols=false > -prevent-rename-protected-symbols=false > -prevent-rename-internal-symbols=false > -prevent-rename-public-static-methods=false > -prevent-rename-public-instance-methods=false > > (for what I read that's the set it can be used without breaking app) > > and a downsize from 1045kb to 910kb so amazing! :) > > I'll try to add to TodoMVC as well and see what happens ;) > > @Andrew I think you and Josh can add this doc to the Royale Docs compiler > options page here [1] > > [1] https://apache.github.io/royale-docs/compiler/compiler-options > > > > El mar, 10 nov 2020 a las 23:36, Josh Tynjala (<joshtynj...@bowlerhat.dev>) > escribió: > >> Hi Andrew, >> >> Yes, I can help with that! >> >> -- >> Josh Tynjala >> Bowler Hat LLC <https://bowlerhat.dev> >> >> >> On Mon, Nov 9, 2020 at 3:22 PM Andrew Wetmore <cottag...@gmail.com> >> wrote: >> >> > Josh, this is very interesting. I would like to include an actionable >> > amount of this information in our user documentation. If I create a >> page in >> > the help docs for it, can you help me populate instructions based on >> your >> > researchs? >> > >> > Thanks! >> > >> > Andrew >> > >> > On Mon, Nov 9, 2020 at 6:16 PM Josh Tynjala <joshtynj...@bowlerhat.dev> >> > wrote: >> > >> > > Hi all, >> > > >> > > Some of you have probably been wondering about my changes to the >> compiler >> > > over the last year or more. I apologize again for occasionally >> breaking >> > > things for short periods. It's been quite a challenge getting this >> stuff >> > > working, but I'm excited to finally be able to report some real >> > > improvements that pretty much anyone should be able to take advantage >> of >> > > when building a Royale app. >> > > >> > > First some background. A while back, Harbs asked me to look into ways >> of >> > > reducing the file size of release builds. As you may know, we use >> > Google's >> > > Closure compiler to optimize our generated JavaScript. Closure can be >> > very >> > > aggressive in its optimizations, by renaming symbols (things like >> > variable >> > > and function names) and removing "dead code" that is detected as never >> > > being called. >> > > >> > > Closure's optimizations are good, but they also require developers to >> be >> > > very careful about how they write their JavaScript code. When you >> enable >> > > Closure's full optimizations, you are not allowed to use certain >> > JavaScript >> > > features because Closure cannot analyze them properly. For instance, >> > > consider the following code: >> > > >> > > var propName= "myProp"; >> > > var value = obj[propName]; >> > > >> > > When you dynamically access a property with a string, Closure cannot >> > > reliably know that the property exists and will be accessed at >> runtime. >> > It >> > > may decide to rename or remove that property, which would break >> things at >> > > runtime. >> > > >> > > ActionScript supports many of the same restricted dynamic features >> too, >> > so >> > > if you want to support the entire AS3 language, we can't let Closure >> do >> > its >> > > full optimization. Luckily, Closure also provides a bit of a >> backdoor: it >> > > allows you to "export" symbols, which means that they won't be renamed >> > and >> > > they won't be removed as dead code. Traditionally, we have made heavy >> use >> > > of this exporting feature in Royale. >> > > >> > > Harbs wanted to know if we absolutely needed to export everything >> that we >> > > currently export, and if we could potentially allow developers to turn >> > off >> > > exporting entirely, as long as they follow the stricter rules >> required by >> > > Closure. >> > > >> > > I won't go into all of the details, but over the last several months, >> > I've >> > > been changing the compiler to give developers more control over >> release >> > > builds. In particular, control over which symbols get exported, but >> also >> > > the ability to block Closure from renaming symbols that haven't been >> > > exported. >> > > >> > > Now, for some of the results. I'm going to share the output file size >> of >> > > the release build for several Royale projects with various different >> > > compiler options. >> > > >> > > For the example projects included with Royale, I built royale-asjs >> commit >> > > 94f12ed0e564b0b443834400dc2fc06d61b90a8a from October 26, 2020. If you >> > want >> > > to try building these examples yourself, the file sizes of release >> builds >> > > may be slightly different, if you use a different commit. >> > > >> > > SpectrumBrowser is a project developed by Harbs and his team. I used >> > commit >> > > d25a3def972b15ec029ae838f1a8a677d2d158bd from October 20 for the >> results >> > > below. Repo: https://github.com/unhurdle/spectrum-royale/ >> > > >> > > To establish a baseline, I built all of these projects with the older >> > > Royale 0.9.7 compiler first. >> > > >> > > ========== >> > > Baseline: royale-compiler 0.9.7 >> > > ========== >> > > >> > > HelloWorld: 68 KB >> > > ASDoc: 231 KB >> > > TourDeJewel: 1074 KB >> > > SpectrumBrowser: 900 KB >> > > >> > > Again, I am building the same AS3/MXML code every time, but these >> first >> > > numbers are from building with the older compiler. All apps build and >> run >> > > successfully. >> > > >> > > ----- >> > > >> > > The rest of the results are built with royale-compiler commit >> > > df8bd9f686f1bbf89539e545377b2797c646172c from November 3. >> > > >> > > All results below include the difference in KB and %. These values are >> > > always in comparison to the baseline numbers above. >> > > >> > > ========== >> > > Result 1: 0.9.8 default options >> > > ========== >> > > >> > > HelloWorld: 84 KB (+10 KB / +24%) >> > > ASDoc: 254 KB (+23 KB / +10%) >> > > TourDeJewel: 1105 KB (+31 KB / +3%) >> > > SpectrumBrowser: 936 KB (+36 KB / +4%) >> > > >> > > These examples are slightly larger when built with the newer compiler. >> > > That's expected. It's not ideal, but in the process of testing a >> > multitude >> > > of things to be sure that nothing had broken after my compiler >> changes, I >> > > discovered some cases where exporting a symbol didn't actually work >> > > correctly in 0.9.7! To properly fix the bug and export these symbols, >> > there >> > > was no choice but to make the file size a bit larger. >> > > >> > > ========== >> > > Result 2: Disable export >> > > ========== >> > > >> > > HelloWorld: 74 KB (+6 KB / +9%) >> > > ASDoc: 227 KB (-4 KB / -2%) >> > > TourDeJewel: 942 KB (-132 KB / -12%) >> > > SpectrumBrowser: 882 KB (-18 KB / -2%) >> > > >> > > In this round, I added the *-export-public-symbols=false* compiler >> > option. >> > > You may recall that I said earlier that I also modified the compiler >> to >> > > allow a symbol not to be exported, but still prevent it from being >> > renamed. >> > > With that in mind, -export-public-symbols=false basically tells the >> > > compiler that it still can't rename things, but it is allowed to >> remove >> > > what it perceives as dead code. >> > > >> > > HelloWorld is still slightly larger than 0.9.7, but the three other >> > > examples are now slightly smaller than 0.9.7. >> > > >> > > Most developers should be able to safely add >> -export-public-symbols=false >> > > to their compiler options when building a Royale app. The only time >> that >> > > you might still want this exporting is if you have external >> JavaScript in >> > > your page that isn't part of your Royale app, but it needs to call >> > > functions/classes in your Royale app. >> > > >> > > ========== >> > > Result 3: Allow non-public things to be renamed >> > > ========== >> > > >> > > HelloWorld: 72 KB (+4 KB / +6%) >> > > ASDoc: 221 KB (-10 KB / -4%) >> > > TourDeJewel: 918 KB (-156 KB / -15%) >> > > SpectrumBrowser: 861 KB (-39 KB / -4%) >> > > >> > > In this round, I used the following compiler options: >> > > >> > > -export-public-symbols=false >> > > >> > > >> > > >> > >> *-prevent-rename-protected-symbols=false-prevent-rename-internal-symbols=false* >> > > >> > > The two new options allow Closure compiler to rename protected and >> > internal >> > > symbols. Once again, HelloWorld is still slightly larger than 0.9.7, >> but >> > > the other three examples have gotten smaller again. >> > > >> > > While -prevent-rename-public-symbols=false exists too, we cannot use >> it. >> > > The examples would not work correctly at runtime. This option would >> > > probably work in a pure AS3 app, but our implementation of MXML in >> Royale >> > > uses dynamic language features that Closure restricts. Unless that is >> > > fixed, we need to avoid renaming certain public symbols. >> > > >> > > Again, most developers should be able to add >> > > -prevent-rename-protected-symbols=false >> > > and -prevent-rename-internal-symbols=false to their Royale app's >> compiler >> > > options. You might need to prevent renaming of protected/internal >> symbols >> > > if you access them dynamically. However, in my experience, people are >> > much >> > > more likely to access public symbols dynamically. >> > > >> > > ----- >> > > >> > > ========== >> > > Result 4: Allow public methods to be renamed >> > > ========== >> > > >> > > HelloWorld: 64 KB (-4 KB / -6%) >> > > ASDoc: 206 KB (-25 KB / -11%) >> > > TourDeJewel: 881 KB (-193 KB / -18%) >> > > SpectrumBrowser: 828 KB (-72 KB / -8%) >> > > >> > > In this round, I used the following compiler options: >> > > >> > > -export-public-symbols=false >> > > -prevent-rename-protected-symbols=false >> > > -prevent-rename-internal-symbols=false >> > > >> > > >> > > >> > >> *-prevent-rename-public-static-methods=false-prevent-rename-public-instance-methods=false >> > > * >> > > >> > > The two new options allow Closure to rename methods that are public. >> Now, >> > > all four examples are smaller than 0.9.7, and the file size >> difference is >> > > getting even more dramatic. >> > > >> > > Once again, -prevent-rename-public-static-methods=false and >> > > -prevent-rename-public-instance-methods=false should be safe for most >> > > developers to enable when compiling their Royale app. In my >> experience, >> > > calling methods dynamically is rare. >> > > >> > > ========== >> > > More new compiler options >> > > ========== >> > > >> > > There are some additional new compiler options available, but using >> them >> > is >> > > likely to break most Royale apps. >> > > >> > > -prevent-rename-public-static-variables=false >> > > -prevent-rename-public-instance-variables=false >> > > -prevent-rename-public-static-accessors=false >> > > -prevent-rename-public-instance-accessors=false >> > > >> > > These options control whether Closure allows variables or accessors >> > > (getters and setters) to be renamed. There are also similarly-named >> > options >> > > for protected and internal symbols, if you want more control over >> those >> > > too, instead of using -prevent-rename-protected-symbols=false and >> > > -prevent-rename-internal-symbols=false. >> > > >> > > Unfortunately, renaming public variables/accessors is usually not >> > possible >> > > without breaking the app at runtime. In some apps, you might be able >> to >> > > allow public static members to be renamed. However, in my experience, >> > > binding to static constants is pretty common, and renaming breaks >> those >> > > bindings. >> > > >> > > ========== >> > > Next Steps >> > > ========== >> > > >> > > Ideally, I'd like to make it possible for developers to be able to >> tell >> > > Closure that it's allowed to rename all symbols, including public >> ones. I >> > > believe that we could see even more file size savings in release >> builds >> > if >> > > Closure works with full optimizations for all symbols. Obviously, >> > > ActionScript developers would be required to strictly follow Closure's >> > > rules, if they opt into renaming of public symbols, but that's a >> choice >> > > that they should be allowed to make. >> > > >> > > As I mentioned above, our implementation of MXML and binding uses >> dynamic >> > > access, which is not compatible with Closure's full optimizations. To >> > > support those optimizations, I will need to explore changes to how we >> > > generate JS for MXML, and how it gets parsed at runtime. >> > > >> > > We previously discussed this subject a bit in this older thread from >> > > January 2020: >> > > >> > > >> > > >> > >> https://lists.apache.org/thread.html/r843e55252e37967b71b1430a2a904719791d698f3e5e2a79de74e493%40%3Cdev.royale.apache.org%3E >> > > >> > > At the time, I tried out some ideas that we came up with while >> > > brainstorming, but all had various downsides that didn't make for an >> > > obvious winner. In the end, I decided to set further investigation >> aside >> > > and first focus on exporting/renaming stuff. Now, I'm ready to take a >> > > second look with a fresh perspective, and maybe we'll have some new >> ideas >> > > to try. >> > > >> > > ----- >> > > >> > > That was really long, so thank you for reading, if you made it to the >> > end! >> > > >> > > TL;DR: By enabling certain, new compiler options, most Royale >> developers >> > > can make their app release builds smaller. Additionally, I plan to >> keep >> > > investigating, and I expect to find more ways to reduce file size in >> the >> > > future. >> > > >> > > -- >> > > Josh Tynjala >> > > Bowler Hat LLC <https://bowlerhat.dev> >> > > >> > >> > >> > -- >> > Andrew Wetmore >> > >> > http://cottage14.blogspot.com/ >> > >> > > > -- > Carlos Rovira > Apache Member & Apache Royale PMC > *Apache Software Foundation* > http://about.me/carlosrovira > > -- Carlos Rovira Apache Member & Apache Royale PMC *Apache Software Foundation* http://about.me/carlosrovira