1. 工具概览
| 维度 | 工具 | 作用 |
|---|---|---|
| 构建系统统计 | Ninja -d stats / -d explain | 任务图、命中/未命中缓存原因 |
| 缓存命中率 | ccache -s / sccache --show-stats | 缓存效果评估 |
| 链接性能 | lld, gold, bfd + --stats | 链接耗时 |
| 编译分析 | Clang-ftime-trace | 各文件/函数,各阶段编译耗时 |
| 无用 include | include-what-you-use (IWYU) 或 其他静态分析器 |
2. -ftime-trace
-ftime-trace 由 Clang 提供,会为每个翻译单元(Translation Unit, TU)生成一个统计 JSON。
2.1 单文件示例
clang++ -std=c++20 -O2 -ftime-trace -c test.cpp -o test.o
2.2 CMake 集成
确保使用 Clang:
cmake -DCMAKE_CXX_COMPILER=clang++ -S . -B build
或设置环境变量 CXX=clang++。
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_compile_options(-ftime-trace -ftime-trace-granularity=200)
endif()
2.3 查看结果
在火焰图图中可以看到各种类型的事件所占用的时间比例,可参考下表:
| 名称 | 说明 | 可能原因 |
|---|---|---|
| Parse/Class Template Instantiation | 模板实例化耗时 | 过度泛型、重复实例 |
| Perform Pending Instantiations | 级联依赖触发 | 头文件结构不佳 |
| CodeGen Function | IR 生成阶段 | 巨函数 / 大量内联 |
| Backend Pass | LLVM 优化/寄存器分配等 | 过高优化级别 -O3 / LTO |
3. ClangBuildAnalyzer 使用
安装 ClangBuildAnalyzer 后,执行:
ClangBuildAnalyzer --all ./build ./report.bin
ClangBuildAnalyzer --analyze ./report.bin
这里贴一个来自原作者的图:

结果中能看到,clang 前后端处理耗时主要在哪些地方,最耗时的模板,最昂贵的头文件(在哪里被引用,被引用了多少次)等等信息,后续可以针对性拆分头文件,加快编译速度。
笔者在自己的工程里面,通过以上方式,将原版编译耗时 6 分 40 秒,优化到了 4 分 20 秒,体验提升很大。
4. 参考
- Perfetto Trace Viewer: https://perfetto.dev/
- Speedscope Flamegraph Viewer: https://www.speedscope.app/
- ClangBuildAnalyzer GitHub: https://github.com/aras-p/ClangBuildAnalyzer
- PImpl Idiom – C++ Core Guidelines discussion: https://isocpp.org/wiki/faq/pimpl
- Include What You Use: https://include-what-you-use.org/
- Extern Template (cppreference): https://en.cppreference.com/w/cpp/language/class_template#Extern_template
- CMake
target_precompile_headersDocumentation: https://cmake.org/cmake/help/latest/command/target_precompile_headers.html - ccache Official Site: https://ccache.dev/
- sccache GitHub: https://github.com/mozilla/sccache
- LLD Performance (LLVM blog / benchmarks): https://lld.llvm.org/
- ThinLTO Design – LLVM: https://llvm.org/docs/ThinLTO.html