Speeding up C++ build times
Overall reaction to the blog post
- Many commenters find the post shallow and self-promotional, arguing it “reinvents the wheel” and rehashes decades‑old C++ knowledge (headers, IWYU, PIMPL, etc.).
- Some say the interesting part is the attempt to auto‑refactor a large C++ codebase and the pain of tooling (libclang, LibTooling), but they still wanted more technical depth and data.
- A few defend the topic as valid, but think solutions like ccache, distcc, unity builds, and linkers are under‑emphasized.
Headers, includes, and PIMPL
- Strong focus on reducing included headers: IWYU, forward declarations, PIMPL, Rob Pike–style “no headers-in-headers,” and avoiding transitive include explosions.
- Others argue modern compilers optimize away duplicate header parsing via include guards /
#pragma once, so header discipline mainly helps via reduced dependencies, not raw re-parsing. - PIMPL sparks heated debate:
- Pro: improves ABI stability, hides implementation, and can help build times.
- Con: feels like a hack, adds indirection/boilerplate, highlights C++’s inability to cleanly separate interface from layout.
Build tooling and workflows
- Common “practical fixes”:
- Compiler caches (ccache/sccache), distributed builds (distcc, icecream, Incredibuild), and remote workers (Bazel).
- Faster linkers (mold) and parallel builds (ninja, CMake presets).
- Precompiled headers and explicit template instantiation.
- Several note that for large projects, link time and template-heavy optimization (e.g., Eigen) dominate, not just preprocessing.
- Some report dramatic improvements (minutes to seconds) from ccache or unity builds; others say incremental builds and linker bottlenecks limit these gains.
Unity / jumbo / single-TU builds
- Widely discussed technique: concatenate many or all .cc files into few big translation units (unity/jumbo/master files).
- Benefits: fewer redundant header parses and more inlining; cited 5–10× compile-time speedups in games and projects like SQLite.
- Downsides: harder incremental builds, tricky failure modes, reduced parallelism unless carefully batched.
Language and ecosystem limitations
- Frustration that C++’s header/preprocessor model is fundamentally flawed; comparisons made to Ada, D, Jai, Rust, and Go.
- C++20 modules seen as a potential big win but currently “bleeding edge,” poorly integrated in tooling/build systems, and not widely adopted (tracked by “are we modules yet” resources).
- Some argue that C++ culture tolerates slow builds and over-complex features, making real fixes slow to arrive.