Profile the build system
Contents
Name of Project
Profile the build system
Description
It's a well known fact that it takes longer to build on Windows than on a comparable Linux or Mac machine. We don't know exactly why, however. There have been many theories, but no real data. Profiling the build system would allow us to figure out where all of the time is being spent. The best place to start might be by adding some profiling to GNU Make, to figure out which targets in our makefiles take the most time. From there, depending on the results, profiling could be added to other parts of the build system to narrow down specific bottlenecks.
References:
- http://wiki.services.openoffice.org/wiki/BuildSpeedup - OpenOffice.org did something similar
Resources: ted
Bugzilla
A bug has been submitted for enhancement on [Bugzilla].
Leader(s)
Project Contributor(s)
- Ted Mielczarek
- Tony Lai
- Zaid Ghansar
- Nino D'Aversa
- Jason Tarka
- Aaron Train
- Chris Bishop
- Chinmay Patel
- Ezadkiel V. Marbella
- Scott Lunel
- Park,KiWon
- Irina Shoykher
- Jesse Valianes
Project Details
- Get where time is spent during the build
- 1 set of data from scratch builds and 1 set of data from rebuilds
- Collect Data
- Get build time info from others
- Build From Scratch, Rebuild with no changes, using/not using -j4 option, hardware info (RAM, CPU, RPM)
- Get build time info from others
- The -j4 option is used in the .mozconfig file
- -j specifies how many concurrent jobs you can run, so for some parts of the tree you get more makes going at once
- mk_add_options MOZ_MAKE_FLAGS=-j4
Releases
Release 0.1 - Oct 13
Goal
- Try out different build options
- See how they affect built
- Try profiling the run-time build
- Time how long it takes on each file/directory during the build
Results for Rebuilds
- Looking at the breakdown of the time, it can be seen that dom, browser, content, toolkit, netwerk, and xpcom take up a large portion of the build time
- The remaining 39.3% of the build time is divided into layout, intl, embedding and other 23 different directories
Charts
Data from 10 Rebuilds were used to create the following charts:
Data
Folders | 1 (sec) | 2 (sec) | 3 (sec) | 4 (sec) | 5 (sec) | 6 (sec) | 7 (sec) | 8 (sec) | 9 (sec) | 10 (sec) | AVG (sec) | % |
dom | 100.359 | 78.483 | 78.530 | 83.454 | 85.608 | 105.346 | 121.647 | 94.457 | 86.579 | 81.220 | 91.568 | 12.46% |
content | 107.504 | 72.521 | 76.064 | 72.693 | 72.175 | 84.936 | 101.252 | 75.230 | 76.487 | 70.748 | 80.961 | 11.02% |
browser | 79.352 | 78.662 | 85.827 | 73.574 | 75.665 | 79.911 | 82.024 | 71.726 | 72.534 | 71.356 | 77.063 | 10.49% |
netwerk | 73.646 | 58.749 | 68.171 | 61.736 | 61.747 | 77.301 | 89.820 | 66.909 | 65.089 | 59.837 | 68.301 | 9.30% |
toolkit | 67.833 | 63.092 | 70.699 | 64.975 | 66.265 | 72.723 | 76.762 | 67.938 | 67.456 | 63.604 | 68.135 | 9.27% |
xpcom | 63.494 | 57.616 | 54.563 | 50.040 | 51.008 | 71.673 | 77.560 | 61.735 | 63.407 | 48.072 | 59.917 | 8.16% |
layout | 67.544 | 41.636 | 43.673 | 43.222 | 44.494 | 49.144 | 76.850 | 45.768 | 43.555 | 42.665 | 49.855 | 6.79% |
intl | 50.631 | 40.152 | 42.585 | 40.364 | 40.779 | 52.670 | 59.998 | 44.475 | 40.644 | 38.891 | 45.119 | 6.14% |
embedding | 39.713 | 33.534 | 33.525 | 34.321 | 35.067 | 39.370 | 44.234 | 36.592 | 34.942 | 33.886 | 36.518 | 4.97% |
editor | 26.544 | 20.365 | 23.146 | 20.031 | 20.868 | 22.450 | 26.921 | 21.583 | 22.397 | 19.463 | 22.377 | 3.05% |
gfx | 22.279 | 14.212 | 14.587 | 14.673 | 16.167 | 17.449 | 26.159 | 15.635 | 14.128 | 14.231 | 16.952 | 2.31% |
docshell | 15.935 | 12.512 | 13.759 | 13.092 | 13.857 | 15.978 | 19.985 | 14.177 | 12.954 | 12.567 | 14.482 | 1.97% |
rdf | 15.287 | 12.746 | 12.636 | 13.285 | 13.497 | 15.735 | 19.098 | 14.593 | 13.312 | 12.964 | 14.315 | 1.95% |
xpfe | 11.707 | 10.972 | 11.337 | 11.267 | 11.531 | 12.907 | 13.344 | 11.754 | 11.429 | 10.915 | 11.716 | 1.59% |
widget | 14.399 | 9.812 | 10.078 | 10.383 | 10.472 | 12.203 | 14.493 | 10.947 | 12.513 | 10.354 | 11.565 | 1.57% |
nsprpub | 9.411 | 8.017 | 7.098 | 7.356 | 7.802 | 16.656 | 10.980 | 7.587 | 7.347 | 7.373 | 8.963 | 1.22% |
uriloader | 8.707 | 7.224 | 7.098 | 7.859 | 8.264 | 10.349 | 11.157 | 8.413 | 7.926 | 7.313 | 8.431 | 1.15% |
storage | 7.811 | 6.412 | 6.708 | 6.909 | 6.848 | 7.746 | 9.900 | 7.387 | 6.413 | 6.513 | 7.265 | 0.99% |
caps | 6.484 | 5.304 | 5.288 | 5.663 | 6.321 | 6.668 | 6.985 | 6.335 | 5.529 | 5.406 | 5.998 | 0.82% |
profile | 5.775 | 5.461 | 5.897 | 5.449 | 5.604 | 6.239 | 6.266 | 5.755 | 5.404 | 5.317 | 5.717 | 0.78% |
xpinstall | 4.772 | 4.072 | 4.570 | 4.243 | 4.264 | 5.161 | 5.592 | 4.349 | 4.183 | 4.068 | 4.527 | 0.62% |
sun-java | 3.528 | 3.307 | 3.214 | 3.353 | 3.557 | 4.090 | 5.230 | 3.630 | 3.271 | 3.332 | 3.651 | 0.50% |
extensions | 3.212 | 3.358 | 4.555 | 3.236 | 3.209 | 3.381 | 3.321 | 2.930 | 3.218 | 3.225 | 3.365 | 0.46% |
chrome | 3.428 | 3.121 | 3.026 | 3.268 | 3.209 | 3.412 | 3.733 | 3.284 | 3.113 | 3.047 | 3.264 | 0.44% |
db | 2.898 | 2.558 | 2.543 | 2.613 | 2.672 | 2.915 | 3.232 | 2.978 | 2.554 | 2.642 | 2.761 | 0.38% |
view | 2.768 | 2.497 | 2.434 | 2.609 | 2.570 | 2.926 | 3.120 | 2.626 | 2.832 | 2.538 | 2.692 | 0.37% |
webshell | 2.585 | 2.477 | 2.709 | 2.541 | 2.565 | 2.946 | 3.311 | 2.745 | 2.601 | 2.437 | 2.692 | 0.37% |
build | 2.252 | 2.066 | 2.162 | 2.139 | 2.191 | 2.201 | 3.217 | 2.232 | 2.486 | 2.054 | 2.300 | 0.31% |
jpeg | 3.053 | 1.529 | 2.110 | 1.651 | 1.617 | 2.396 | 2.641 | 1.647 | 1.526 | 1.573 | 1.974 | 0.27% |
config | 2.131 | 1.373 | 1.466 | 1.489 | 1.422 | 2.659 | 2.424 | 1.425 | 2.003 | 1.364 | 1.776 | 0.24% |
probes | 0.423 | 0.426 | 0.437 | 0.455 | 0.447 | 0.422 | 0.543 | 0.435 | 0.468 | 0.412 | 0.447 | 0.06% |
- File with data used to generate charts and the charts can be found here: Rebuild Analysis xls
- A copy of all the logs I used or generated for the results can be found here: Build Logs Part 1 and Build Logs Part 2
- A copy of the rules.mk I've edited from the config folder can be found here: config/rules.mk
- An interesting and note worthy point in the analysis, is that most of these folders are visited multiple times during the build
Release 0.2 - Nov 10
- TBA
Release 0.3 - Dec 1
- TBA
Project Data
Contribution Instructions
- Please feel free to fill in the table to help me collect more data
- YOU WILL BE CONSIDERED AS A PROJECT CONTRIBUTOR FOR PROVIDING DATA
- you can time your build by adding the "time" command in front of your build command like so:
- time make -f client.mk build
Sample Build Data
Build From Scratch
HH:MM:SS |
Rebuilt No Changes
HH:MM:SS |
with -j# | RAM
(GB) |
CPU
(GHz) |
HD
(rpm) |
OS | User | Mozconfig |
0:55:05 | 0:20:17 | 5 | 4 GB | 2.0 Duo | 7200 | Vista Business | Patrick | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser mk_add_options MOZ_MAKE_FLAGS=-j5 |
1:02:35 | 0:20:09 | 5 | 4 GB | 2.0 Duo | 7200 | Vista Business | Patrick | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser mk_add_options MOZ_MAKE_FLAGS=-j5 ac_add_options --disable-vista-sdk-requirements ac_add_options --disable-tests ac_add_options --disable-accessibility ac_add_options --disable-mochitest |
0:59:00 | 0:20:45 | 4 | 4 GB | 2.0 Duo | 7200 | Vista Business | Patrick | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser mk_add_options MOZ_MAKE_FLAGS=-j4 |
1:15:25 | 0:21:22 | N/A | 4 GB | 2.0 Duo | 7200 | Vista Business | Patrick | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser |
1:03:00 | 0:18:14 | N/A | 1 GB | 1.6 Duo | - | XP Media | Tony | |
0:58:40 | - | N/A | 1 GB | 1.6 Duo | - | Ubuntu (VirtualBox) | Tony | |
0:55:00 | - | 4 | 2.5 GB | 1.6 AMD TurionX2 | - | XP Professional | Zaid | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ mk_add_options MOZ_MAKE_FLAGS=-j4 ac_add_options --enable-application=browser ac_add_options --enable-libxul ac_add_options --disable-tests ac_add_options --disable-mochitest ac_add_options --disable-vista-sdk-requirements |
real 0:44:29 user 0:13:16 sys 0:07:52 |
real 0:07:48 user 0:05:42 sys 0:03:29 |
5 | 2.5 GB | 1.6 AMD TurionX2 | - | XP Professional | Zaid | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ mk_add_options MOZ_MAKE_FLAGS=-j5 ac_add_options --enable-application=browser ac_add_options --enable-libxul ac_add_options --disable-tests ac_add_options --disable-mochitest ac_add_options --disable-vista-sdk-requirements |
real 0:66:34 user 0:13:15 sys 0:07:54 |
real 0:09:00 user 0:05:46 sys 0:03:41 |
N/A | 2.5 GB | 1.6 AMD TurionX2 | - | XP Professional | Zaid | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser ac_add_options --enable-libxul ac_add_options --disable-tests ac_add_options --disable-mochitest ac_add_options --disable-vista-sdk-requirements |
1:17:44 | - | 2 | 1.5 GB | 1.8 AMD Mobile Sempron | 5400 | Vista Business (32-bit) | Nino | |
0:24:15 | 0:01:07 | N/A | 2 GB | 2.66 Duo | 7200 | Ubuntu 8.04 (64-bit) | Jason | |
0:15:12 | 0:01:04 | 4 | 2 GB | 2.66 Duo | 7200 | Ubuntu 8.04 (64-bit) | Jason | |
0:28:18 | 0:01:04 | 5 | 1.5 GB | 1.66 Duo | 5400 | Ubuntu 8.04 (32-bit) | Jason | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser ac_add_options --enable-optimize ac_add_options --enable-default-toolkit=cairo-gtk2 ac_add_options --disable-tests ac_add_options --disable-mochitest mk_add_options AUTOCONF=autoconf2.13 |
0:43:14 | - | - | 2 GB | 1.80 AMD Mobile Sempron | 5400 | Ubuntu 8.04 (32-bit) | Aaron T | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ ac_add_options --disable-optimize ac_add_options --disable-static --enable-shared |
real 0:18:16 user 0:10:34 sys 0:03:0 |
real 0:02:59 user 0:04:15 sys 0:01:23 |
5 | 2 GB (Upgraded to more/faster rame) | 2.0 Duo ( OC'd to 2.41 ) | 7200 (src) to External (dest) - speed bump doing this | Windows XP Professional ( 32-bit) - Visual Studio 2005 | Chris Bishop | . $topsrcdir/browser/config/mozconfig mk_add_options MOZ_OBJDIR=/i/mozilla/ff-opt mk_add_options MOZ_MAKE_FLAGS=-j5 ac_add_options --disable-vista-sdk-requirements ac_add_options --disable-tests ac_add_options --disable-debug ac_add_options --disable-accessibility |
real 0:29:13 user 0:11:26 sys 0:03:47 |
real 0:05:8 user 0:04:47 sys 0:01:43 |
5 | 1 GB | 2.0 Duo ( OC'd to 2.41 ) | 7200 | Windows XP Professional ( 32-bit) | Chris Bishop | . $topsrcdir/browser/config/mozconfig mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/ff-opt mk_add_options MOZ_MAKE_FLAGS=-j5 ac_add_options --disable-tests |
real 0:36:50 user 0:10:44 sys 0:03:30 |
real 0:05:7 user 0:04:17 sys 0:01:31 |
5 | 1 GB | 2.0 Duo ( OC'd to 2.41 ) | 7200 | Windows XP Professional ( 32-bit) - VS 2008 - Vista SDK | Chris Bishop | . $topsrcdir/browser/config/mozconfig mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/ff-opt ac_add_options --disable-vista-sdk-requirements ac_add_options --disable-tests ac_add_options --disable-accessibility |
real 0:27:50 user 0:10:51 sys 0:03:42 |
real 0:04:46 user 0:04:21 sys 0:01:32 |
5 | 1 GB | 2.0 Duo ( OC'd to 2.41 ) | 7200 | Windows XP Professional ( 32-bit) - VS 2008 - Vista SDK | Chris Bishop | . $topsrcdir/browser/config/mozconfig mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/ff-opt mk_add_options MOZ_MAKE_FLAGS=-j5 ac_add_options --disable-vista-sdk-requirements ac_add_options --disable-tests ac_add_options --disable-accessibility |
- |
FireFox: |
5 | 2 GB | AMD turion 64x2 | Windows Vista Home ( 32-bit) | Chinmay Patel | . ac_add_options --enable-application=mail mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/tbird-debug mk_add_options MOZ_CO_PROJECT=mail,calendar ac_add_options --disable-optimize ac_add_options --enable-debug mk_add_options MOZ_MAKE_FLAGS=-j5 | |
real 33m57.475s user 31m40.558s sys 8m36.924s |
real 2m51.103s user 0m49.142s sys 1m3.305s |
4 | 3 GB 667 MHz | Intel Core 2 Duo 2.16 GHz | 7200 | Mac OSX 10.4.11 | Ezadkiel V. Marbella | . $topsrcdir/browser/config/mozconfig export MOZCONFIG=~/mozilla/mozconfig-firefox mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ mk_add_options MOZ_MAKE_FLAGS=-j5 mk_add_options MOZ_CO_PROJECT=browser ac_add_options --enable-debug ac_add_options --enable-tests ac_add_options --enable-application=browser |
53:43 | 22:18 | None | 1 GB | Intel 3.0 GHZ Single Core | 7200 | Microsoft Windows XP Service Pack 3 | Scott Lunel | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-firefox mk_add_options MOZ_CO_PROJECT=browser ac_add_options --enable-application=browser ac_add_options --disable-optimize ac_add_options --enable-debug ac_add_options --disable-tests ac_add_options --disable-vista-sdk-requirements |
1Hr 15min | _ | None | 1G | Intel 1.8 GHZ Duo Core | 7200 | Microsoft Windows XP Service Pack 2 | Park,KiWon | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-firefox mk_add_options MOZ_CO_PROJECT=browser ac_add_options --enable-application=browser ac_add_options --disable-optimize ac_add_options --enable-debug ac_add_options --enable-tests |
1:05:32 | 0:11:14 | 8 | 4G | Quad-core 2.4 | 7200 | Microsoft Windows XP Prof | Irina Shoykher | ac_add_options --enable-application=browser mk_add_options MOZ_CO_PROJECT=browser ac_add_options --disable-vista-sdk-requirements ac_add_options --enable-debug ac_add_options --disable-optimize ac_add_options --enable-libxul ac_add_options --disable-tests ac_add_options --disable-mochitest ac_add_options --disable-accessibility mk_add_options MOZ_MAKE_FLAGS=-j8 |
real 01:25:35 user 00:14:08 sys 00:18:37 |
real 00:19:02 user 00:05:44 sys 00:07:58 |
4 | 1 GB | Pentium 4 2.6C | 7200 | XP Professional | Jesse Valianes | mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obj-@CONFIG_GUESS@ mk_add_options MOZ_MAKE_FLAGS=-j4 ac_add_options --enable-application=browser ac_add_options --enable-libxul ac_add_options --disable-tests ac_add_options --disable-mochitest ac_add_options --disable-vista-sdk-requirements |
Project News / Updates
October 2008
10/20/2008 -
- Redo Pie Chart
- Used all 10 Rebuild Data
- Changed the app to generate better extractions from logs
10/17/2008 -
- Finished making app to extract times from log
- App breaks down log into 3 files
- File with all lines starting with 'make' (directory path) and 'real' (time)
- File with just 1 'make' and 1 'real' line for each time - there are times for multiple 'make'
- File with just level 1 directory times
- App breaks down log into 3 files
- Adding times up for amount spent in each level 1 directory
- Created diagram to illustrate time breakdown
10/15/2008 -
- Creating app to extract time from log
- Timing the build multiple times for both scratch and rebuilds (aiming for 10 builds each)
10/13/2008 -
- Timed time spent in each directory
- Working on extracting the data from log
10/02/2008 -
- Talked with Ted, guided me to look into rules.mk
- Continuing testing for timing the build
September 2008
09/30/2008 -
- Looked through many files and still haven't found where code for timing can go
- Suspect most options don't affect build speed, except -j and optimize
09/25/2008 -
- After couple more testing with the build options, starting to notice they don't make a big difference
09/18/2008 -
- Use time command to time build time
- ie. time make -f client.mk build
- Start collecting data
09/17/2008 -
- Built the first time in 1h 20m
- Rebuilt second time in 35m with all apps off
- Talked with Shaver and directed me to thread on shrinking build time
- Thread talked about /MP command for building in VS -> not useful in my case
- Dave's suggestion
- Understand what each part of the build is taking
- Collect win32 build times from colleagues
09/16/2008 -
- Talked with Ted Mielczarek, briefly discussed about where to start and how to approach this project.
- Start by timing how long each make file is
- Identify which make file takes a long time
09/15/2008 -
- Created Project page for this project.