Clang 9+ -ftime-trace可以很方便地获取单个文件编译最耗时,但当一个工程中有多个文件需要构建时,如何找最耗时的操作就尤为重要,例如:在整个构建过程中那个文件编译最耗时,那个头文件包含最耗时,那个C++模板实例化最耗时,那个文件以及那个函数代码生成最耗时等。ClangBuildAnalyzer应运而生。
1 编译/安装ClangBuildAnalyzer
首先下载ClangBuildAnalyzer:
git clone https://github.com/aras-p/ClangBuildAnalyzer.git
or
git clone https://gitee.com/wangwenchaonj/ClangBuildAnalyzer.git
编译ClangBuildAnalyzer:
cd ClangBuildAnalyzer
make -f projects/make/Makefile
将ClangBuildAnalyzer添加到系统路径:
cd build
cp ClangBuildAnalyzer /usr/local/bin/
root@ubuntu:/home/~# ClangBuildAnalyzer
USAGE: one of
ClangBuildAnalyzer --start <artifactsdir>
ClangBuildAnalyzer --stop <artifactsdir> <filename>
ClangBuildAnalyzer --analyze <filename>
2 待优化工程参数设置
设置clang编译器:
export CC=/usr/local/bin/clang
export CXX=/usr/local/bin/clang++
设置clang编译器-ftime-trace
参数:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftime-trace")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftime-trace")
3 编译
对ClangBuildAnalyzer源码进行编译:
mkdir build
ClangBuildAnalyzer --start ./build
make -f projects/make/Makefile
ClangBuildAnalyzer --stop ./build/ ClangBuildAnalyzer.data
ClangBuildAnalyzer --analyze ClangBuildAnalyzer.data
ls
chmod -R 777 *
4 ClangBuildAnalyzer工程编译时长分析
|-- CMakeLists.txt
|-- ClangBuildAnalyzer.ini
|-- build
|-- license.md
|-- projects
| |-- make
| |-- vs2019
| `-- xcode
|-- readme.md
|-- src
| |-- Analysis.cpp
| |-- Analysis.h
| |-- Arena.cpp
| |-- Arena.h
| |-- BuildEvents.cpp
| |-- BuildEvents.h
| |-- Colors.cpp
| |-- Colors.h
| |-- Utils.cpp
| |-- Utils.h
| |-- external
| `-- main.cpp
`-- tests
|-- clang11-pid-45
|-- hlsl2glsl-mac-clang-10.0-dev
|-- libreoffice-skiahelper-clang-11-dev
|-- self-win-clang-cl-10.0rc2
|-- self-win-clang-cl-9.0rc2
`-- verylong-symbol-name-38
增加-ftime-trace(CMakeLists.txt)参数:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ftime-trace")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftime-trace")
rm -rf *
cmake ../
ClangBuildAnalyzer --start ./
make
ClangBuildAnalyzer --stop ./ ClangBuildAnalyzer-test
ClangBuildAnalyzer --analyze ClangBuildAnalyzer-test
root@ubuntu:/home/wwchao/project/ClangBuildAnalyzer/build# ClangBuildAnalyzer --analyze ClangBuildAnalyzer-test
Analyzing build trace from 'ClangBuildAnalyzer-test'...
**** Time summary:
Compilation (15 times):
Parsing (frontend): 8.3 s
Codegen & opts (backend): 3.9 s
**** Files that took longest to parse (compiler frontend):
1434 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/simdjson/simdjson.cpp.json
1040 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/BuildEvents.cpp.json
982 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/Analysis.cpp.json
882 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/enkiTS/TaskScheduler.cpp.json
715 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/ItaniumDemangle.cpp.json
682 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/main.cpp.json
512 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/MicrosoftDemangle.cpp.json
478 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/inih/cpp/INIReader.cpp.json
402 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/MicrosoftDemangleNodes.cpp.json
374 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/Utils.cpp.json
**** Files that took longest to codegen (compiler backend):
2578 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/simdjson/simdjson.cpp.json
386 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/Analysis.cpp.json
292 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/ItaniumDemangle.cpp.json
199 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/BuildEvents.cpp.json
99 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/main.cpp.json
82 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/MicrosoftDemangle.cpp.json
57 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/enkiTS/TaskScheduler.cpp.json
49 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/inih/cpp/INIReader.cpp.json
39 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/xxHash/xxhash.c.json
34 ms: /CMakeFiles/ClangBuildAnalyzer.dir/src/external/llvm-Demangle/lib/MicrosoftDemangleNodes.cpp.json
5 参考链接
[1] https://github.com/aras-p/ClangBuildAnalyzer/tree/v1.2.0
[2] https://www.snsystems.com/technology/tech-blog/clang-time-trace-feature
[3] https://aras-p.info/blog/2019/01/16/time-trace-timeline-flame-chart-profiler-for-Clang/
[4] https://firmwaresecurity.com/2019/11/01/clang-build-analyzer-clang-build-analysis-tool/
[5] https://aras-p.info/blog/2019/09/28/Clang-Build-Analyzer/
[6] https://aras-p.info/blog/2019/01/12/Investigating-compile-times-and-Clang-ftime-report/
[7] https://github.com/jlfwong/speedscope