Firefox/Projects/Startup Time Improvements
Overview
Project lead: Dietrich Ayala
Project members: Ryan Flint, Drew Willcoxon, David Dahl, Vlad Vukićević, Taras Glek, Joel Reymont, Ben Hsieh
Description: Investigate areas for improving startup time of the Mozilla platform, find & fix issues that help Fennec and WinCE.
Bugs:
Results
See results in the Performance Snapshot.
Projects
Areas of Work:
- minification
- bug 524858 - minify js
- bug 513132 - minify css
- bug 523479 - minify extension's contents
- file combining
- bug 507101 - combining js components
- bug 509755 - put modules into a jar
- bug FILEME - string pool for jsxpcom
- taking advantage of tracing
- figure out where we're not tracing in the startup log
- traceviz (bug 497999)
- static build
Measurement & Testing
- cold startup testing
bug 510587 - mac and linux- bug 522807 - windows
- dirty profile testing
bug 414660 - infrastructure & places- bug 515540 - dirty+cold startup
- bug 527596 - dirty Tp (teehee)
- bug FILEME - test an all-dirty profile
- bug FILEME - other dirty profiles
- micro-benchmarking
- bug 523146 - test framework
- bug 479528 - for location bar
- bug 451607 - for places UI
- bug 479528 - for places SQL
- more, eg: test for opening the 80th tab
- built-in startup measurement (bug 522375)
- user-runnable Ts script, paste into js console
- restarts browser, passing last known time
- loads data URI that reads startup time and prints it out
- record startup timestamp as a pref?
- timeline of the startup path (David, Vlad)
- Status: incomplete (held up on hangs, nspr changes)
- docs
- bug 480735 instrumentation
- bug 503605 visualization (Simile timeline, raw log)
Docs:
- write best practices recommendation
Inactive Projects
- Mine the Ts DTrace viz/logs (Drew)
- Status: complete, moved on to filesystem operations below
- Results
- cold startup is heavily I/O-bound. 90% of cold startup time is spent in page faults and other I/O syscalls, especially read, getattrlist, and stat.
- majority of time spent after Firefox actually gets up and running is in XBL and CSS.
- Log and mine filesystem operations during startup (Ryan, Drew)
- Status: complete, bugs filed for egregious offenders
- Results
- checking out Xperf and others for Windows work
- investigating dtrace timing/FS cache issues on OS X
- Instruments appears to have the same issues
- Simple JS file exec script has yielded some results
- References
- Find dead code with JSHydra (David Dahl)
- Status: incomplete, needs tuning and file bugs on dead code found
- bug 506128 - run jshydra to find js functions that have no callers
- JSHydra continuous testing
- possible test scenarios
- ending semicolon bug (XXX)
- dead code finder
- possible test scenarios
Status Updates
References
- Meta bugs
- bug 459117 Fennec performance meta bug
- bug 447581 Startup meta bug
- bug 479078 Startup research meta bug
- bug 7251 very old startup meta bug
- Vlad's blog posts
- Taras' Fennec Startup Work
- bug 459117 "make fennec faster", mostly startup bugs
- startup log
- bug 470116 various timing scripts
Tips, Tools
- Cold startup
- Flushing Windows' disk cache
- Flushing Mac OS X's disk cache
- Firefox/Projects/Startup_Time_Improvements_Notes: Vlad's emails about cold startup, including Linux (maybe move this info to this page)
- Windows Prefetch/Superfetch
- XP Prefetch wiki
- Vista/Win7 SuperFetch wiki
- useful Pre/SuperFetch overview
- Presentation slides on the guts of Pref/SuperFetch by military forensic analyst
- Prefetch
- Profile for each application: List of DLLs used, Run count, Time stamps
- Prefetch files stored in %SystemRoot%\Prefetch: .pf extension, Up to 128 are kept
- Can tell if same app run from multiple locations
- SuperFetch
- turn off: net stop sysmain
- AG*.db files, contain "scenarios" for preloading
- Prefetch
- Technet article on Vista mem mgmnt
- registry keys for toggling SuperFetch
- DTrace
- nuts and bolts how-to for getting dtrace running with mozilla
- project overview of integrating dtrace with mozilla
- dtrace community page, lots of links
- dtrace homepage? not as useful as previous link
- intro from dtrace guidebook, really useful but not mozilla/js-specific
- brief descriptions of the javascript* probes
- David Mandelin's notes on tracing C++ code
- comparing dynamic linking time between firefox and safari on mac
- DYLD_PRINT_STATISTICS=YES /Applications/Firefox.app/Contents/MacOS/firefox-bin
- DYLD_PRINT_STATISTICS=YES open -a Safari
Fastload
- why does js_Execute take so long for fastloaded components?
- what is fastload?
- fastload pref docs
Measuring Ts
We've been using a method Vlad blogged about here. The steps are below.
- save this html file somewhere locally
- create a new profile, run Firefox with it at least once, so all files are created, etc
- execute this command, with your profile name substituted, and invoking firefox in a way appropriate for your platform:
./firefox -P YourProfileName -no-remote file:///..../startup.html#`python -c 'import time; print int(time.time() * 1000);'`
The following is specific to Mac OSX and is required to evict Firefox code pages from memory and clear the Unified Buffer Cache (UBC). purge
does NOT do this.
#!/bin/sh FF=/tmp/firefox mkdir $FF > /dev/null 2>&1 umount $FF > /dev/null 2>&1 mount_hfs /dev/disk1s2 $FF $FF/Minefield$*.app/Contents/MacOS/firefox-bin -no-remote -foreground file://$FF/startup.html#`python -c 'import time; print int(time.time() * 1000);'`
This assumes that your removable media is at /dev/disk1s2.
First, mount you external USB HD normally and use df
to see what device is being used. Then eject the drive using diskutil umount /Volumes/YourDrive
and you are set.
Do not eject the device using the Finder as that will not make it available at /dev/disk1s2 or wherever it was.
Test Coverage
This is an index of Firefox startup scenarios which need automated test coverage.
TODO:
- groups: chrome, content, extensions, labs, other?
- mark which need no-chrome testing
test | warm start | cold start | notes |
empty profile | yes | yes | |
everything dirty | bug 515540 | ||
min places | yes | yes | informed by places-stats, bug 515540 |
med places | yes | yes | ditto |
max places | yes | yes | ditto |
med session | informed by test pilot data | ||
max session | ditto | ||
downloads | |||
url-classifier data | data is fully downloaded, should test page-load for a match and no match | ||
form history | |||
passwords | |||
plugins | |||
content preferences | |||
extensions | top 5? | ||
extension update | |||
application update | |||
persona applied | |||
weave | |||
jetpack | |||
ubiquity | |||
page links are visited | |||
page has microformats | |||
page is ssl | |||
page has plugin |