G’day folks, just another Firefox Performance Update coming down the pike1 for you, so strap in.
But first a word from our sponsor: health.graphics!
This performance update is brought to you by The Quantum Dashboards at health.graphics! The first step to changing something is to measure it over time, and once you have those measurements, it’s usually a good idea to find some kind of visual representation for that measurement so that you can track your progress.
Contrary to the domain name, health.graphics measures much more than just the health of our graphics layer. The dashboards at health.graphics show visualizations for a bunch of measurements that we care about – from crash rates, to platform feature state, to raw performance numbers, these dashboards help us make sure that we’re not back-sliding on things that truly matter to us and our users.
And now for some Performance Project updates!
Early first blank paint (lead by Florian Quèze)
Florian sent out an Intent to Ship for this perceived performance optimization for Firefox 61. The beta channel will transition to 61 in a bit over a week, and we’ll use that cycle to ensure that the feature should ship out to release.
Faster content process start-up time (lead by Felipe Gomes)
After some research and examination of how our content processes initialize themselves, the first few bugs have started to get filed to get fixed. This bug, for example, is for introducing infrastructure to make the privileged JavaScript loaded in the content processes more lazy. Another bug was filed to shine some light on the “dark matter” that exists at the start of many content processes in our profiler tools.
Get ContentPrefService init off of the main thread (lead by Doug Thayer)
After much heroic effort, this has landed! If you’re curious about the shutdown leak that was preventing this from landing earlier, here’s the patch that fixed it. Spoiler alert: it was the spellchecker, of all things.
This project is done, and will be removed from the updates from here forward.
Blocklist async-ification (lead by Gijs Kruitbosch)
As of a few days ago, all public blocklist API calls are asynchronous! This was a monumental effort from Gijs, and should result in faster start-up times for some of our users (especially ones with slower magnetic disks).
There are still some very minor internal mechanisms that can still cause the blocklist to be loaded synchronously, but hitting these should be super rare. In the meantime, now that the async-ification is complete, we have an eye towards migrating the back-end to indexedDB.
As the async-ification is wrapped, we’ll be removing this section from the updates from here forward.
LRU cache for tab layers (lead by Doug Thayer)
The patch to introduce the LRU cache have been written and are just waiting until the 62 cycle to begin on Nightly in order to land. No doubt there’ll be some interesting edge-cases to hammer out, but we’re very excited to see how this improves tab switching times for our users!
Tab warming (lead by Mike Conley)
After sending out an Intent to Ship, the prefs to allow Tab warming to ride to release on Windows and Linux were flipped. If all goes well on Beta, Windows and Linux Desktop users should see some nice tab switching performance improvements in Firefox 61!
While investigating the behaviour that’s preventing us from shipping tab warming on macOS, a new bug was filed to try to reduce the number of paints that are occurring during tab switches.
Firefox’s Most Wanted: Performance Wins (lead by YOU!)
Before we go into the grab-bag list of performance-related fixes – have you seen any patches landing that should positively impact Firefox’s performance? Let me know about it so I can include it in the list, and give appropriate shout-outs to all of the great work going on! That link again!
Grab-bag time
And now, without further ado, a list of performance work that took place in the tree:
(🌟 indicates a volunteer contributor)
- Daniel Holbert made it so that we’re more efficient when calculating the sizes of flex containers
- Mike de Boer made it so that when you restore a session with several windows, the most recently used window appears first and stays on top during the restore – this means users have to spend less time getting back to what they were doing.
- Kris Maglione flipped the pref that loads WebExtension background scripts in their own separate process for macOS! This was previously only supported on Windows. This is great for stability, security and performance! Kris also optimized some Add-on Manager code that runs on every start-up, which should gain us a nice start-up performance win
- Marco Bonardo made it so that we don’t send unnecessary Download API updates when adding session history entries
- Matt Woodrow got rid of an unneeded hash table and all associated look-ups in our retained displaylist code
- Bas Schouten added some SIMD optimizations to our 2D geometry code. Bas says that, depending on the circumstances, this should buy us a 2x-4x performance boost for some frequently used geometric calculations.
- Hiroyuki Ikezoe made it so that we now skip running calculations for animations that should not have changed yet
- Mike Conley made it so that we can avoid some main-thread IO when initializing the Gecko Media Plug-ins backend.
- Gijs Kruitbosch made it so that we do less synchronous layout flushing when resizing browser windows
- Andrew McCreight fixed a rather nasty ghost window leak, which potentially means less cycle and garbage collecting for some users.
Thanks, folks!
I used to think it was pipe. It’s pike. ↩