mozilla / grcov

Rust tool to collect and aggregate code coverage data for multiple source files
Mozilla Public License 2.0
1.14k stars 148 forks source link

Evaluate using Profile-Guided Optimization (PGO) and LLVM BOLT #1128

Open zamazan4ik opened 8 months ago

zamazan4ik commented 8 months ago

Hi!

Recently I checked Profile-Guided Optimization (PGO) improvements on multiple projects. The results are here. E.g. PGO results for LLVM-related tooling are here. According to the tests, PGO usually helps with the compiler and compiler-like workloads (like static analysis) - e.g. Clang gets +20% compilation speed with PGO. That's why I think trying to optimize grcov with PGO can be a good idea.

I already did some benchmarks and want to share my results.

Test environment

Benchmark

For benchmark purposes, I use grcov benchmarks via cargo +nightly bench. For PGO optimization I use cargo-pgo tool. The same benchmark suite was used for the PGO training phase via cargo +nightly pgo bench. PGO optimized results I got with cargo +nightly pgo optimize bench.

I met a small issue with benchmarks https://github.com/mozilla/grcov/issues/1127 but quickly fixed it by using precision = 2 (found a similar parameter somewhere in the repository).

Results

I got the following results:

At least according to the provided by grcov project benchmarks, PGO helps with optimizing performance.

Further steps

I can suggest the following action points:

Testing Post-Link Optimization techniques (like LLVM BOLT) would be interesting too (Clang and Rustc already use BOLT as an addition to PGO) but I recommend starting from the usual PGO.

Here are some examples of how PGO optimization is integrated in other projects:

marco-c commented 8 months ago

Happy to accept a PR to use PGO