Quantum Flow Engineering Newsletter #20
It is hard to believe that we’ve gotten to the twentieth of these newsletters. That also means that we’re very quickly approaching the finish line for this sprint. We only have a bit more than five more weeks to go before Firefox 57 merges to beta. It may be a good time to start to think more carefully about what we pay attention to in the remaining time, both in terms of the risk of patches landing, and the opportunity cost of what we decide to put off until 58 and the releases after.
We still have a large number of triaged bugs that are available for someone to pick up and work on. If you have some spare cycles, we really would appreciate if you consider picking one or two bugs from this list and working on them. They span many different areas of the codebase so finding something in your area of interest and expertise should hopefully be simple. Quantum Flow isn’t the kind of project that requires fixing every single one of these bugs to be finished successfully, but at the same time big performance improvements often consist of many small parts, so the cumulative impact of a few additional fixes can make a big impact.
Moving on to mention one point about Speedometer charts on AWFY which I have gotten a few questions about recently. We now have Speedometer benchmark numbers on Firefox Beta on the reference hardware reported in addition to inbound optimized and PGO builds. You may notice that the benchmark score numbers we are getting on Beta are around the same as Nightly (which swings around 83-84 these days). This doesn’t mean that we haven’t made any improvements on Nightly since the last Beta merge! We have some Nightly only telemetry code and some features that are only enabled on the Nightly channel, and those add a bit of overhead, which causes us to see a bit of an improvement after an uplift from mozilla-central to mozilla-beta without any code changes. This means that when the current code on Nightly gets merged to Beta 57, we should expect a bit of an improvement similarly.
And now let me take a moment to acknowledge the work of some of those who helped make Firefox faster last week. I hope I’m not dropping anyone’s name mistakenly.
- Perry Jiang made _shouldCapture() run off of the idle queue and do nothing for about: pages. Perry also made it so that we don’t unnecessarily load the autoscroll PNG when opening a new window.
- Kris Maglione fixed a recent regression causing extremely poor performance with extensions which have scripts creating large numbers of message listeners which never call their response callbacks. He also made code that registers a lot of lazy module and service getters use loops to make such code easier to optimize by SpiderMonkey JIT. He furthermore switched away from using FileUtils.getFile() which does main-thread I/O to check for the respective directory exists. Kris also made us not create the IndexedDB bindings in sandboxes since they’re never used and avoided adding the caller location to the sandbox name if an explicit name if provided by the caller.
- Jan de Mooij added a megamorphic SetElement stub. He also optimized ToPropertyKey a bit.
- Nicolas B. Pierron optimized the LIRGenerator/CodeGenerator snapshot code.
- André Bargull removed some unnecessary allocations and rooting in the RegExp code. He also moved Array.prototype.sort entry point to self-hosted JS code in order to avoid frequent C++ to JS calls when sorting an array with a comparator argument present.
- Zibi Braniecki got rid of expensive per-option element styling that we used to have for select boxes in e10s mode.
- Adam Gashlin made us use a low priority timer for Places expiration.
- Henri Sivonen made the HTML parser atomize class attribute values for the class of single class values when parsing innerHTML strings. This speeds up parsing HTML strings used in innerHTML setters that have class=”foo” attributes.
- Ting-Yu Chou ensured that we calculate the spill weight of a range’s uses when we add to or remove from it, as opposed to the cache unfriendly iteration over the range’s uses to calculate this information when needed.
- Mason Chang got rid of some graphics overhead that we had accidentally accumulated on the hidden window on macOS.
- Edouard Oger ensured that the sync-illustration SVG is not loaded until it’s needed.
- Jonathan Watt avoided some hashtable lookups in undisplayed maps for elements without display:none or display:contents children.
- Blake Kaplan avoided some unneeded sync IPC for performing URI fix-up by creating a URI object explicitly in the content process.
- Jonathan Kew avoided some memory allocation churn in gfxFont::GetRoundOffsetsToPixels().