Profile Guided Optimization

PGO is the process of adding probes to a compiled binary, running said binary, then using the run-time information to recompile the binary to (hopefully) make it faster.

How PGO Builds Work

The supported interface for invoking a PGO build is to evaluate the build target of client.mk with MOZ_PGO defined. e.g.:

$ make -f client.mk MOZ_PGO=1

This is equivalent to:

$ make -f client.mk profiledbuild

Which is roughly equivalent to:

  1. Perform a build with MOZ_PROFILE_GENERATE=1 and MOZ_PGO_INSTRUMENTED=1
  2. Package with MOZ_PGO_INSTRUMENTED=1
  3. Performing a run of the instrumented binaries
  4. $ make maybe_clobber_profiledbuild
  5. Perform a build with MOZ_PROFILE_USE=1

Differences between toolchains

There are some implementation differences depending on the compiler toolchain being used.

The maybe_clobber_profiledbuild step gets its name because of a difference. On Windows, this step merely moves some .pgc files around. Using GCC or Clang, it is equivalent to a make clean.