我需要弄清楚哪些翻译单元需要重组以缩短编译时间,如何使用 cmake 为我的翻译单元掌握编译时间?
4 回答
以下属性可用于计时编译器和链接器调用:
这些属性可以全局设置,每个目录和每个目标。这样,您只能有一部分目标(例如测试)受到此属性的影响。您也可以为每个目标设置不同的“启动器”,这也可能有用。
请记住,直接使用“时间”是不可移植的,因为此实用程序并非在 CMake 支持的所有平台上都可用。但是,CMake 在其命令行工具模式中提供了“时间”功能。例如:
# Set global property (all targets are impacted)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
# Set property for my_target only
set_property(TARGET my_target PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")
示例 CMake 输出:
[ 65%] Built target my_target
[ 67%] Linking C executable my_target
Elapsed time: 0 s. (time), 0.000672 s. (clock)
请注意,从 CMake 3.4 开始,只有 Makefile 和 Ninja 生成器支持此属性。
另请注意,从 CMake 3.4cmake -E time
开始,参数内部存在空格问题。例如:
cmake -E time cmake "-GUnix Makefiles"
将被解释为:
cmake -E time cmake "-GUnix" "Makefiles"
我提交了修复这个问题的补丁。
我希望用'time original-cmd'替换编译器(和/或链接器)。使用简单的“make”,我会说:
make CC="time gcc"
“时间”程序将运行命令并报告它所花费的时间。等效机制适用于“cmake”。如果您需要捕获命令以及时间,那么您可以编写自己的命令,类似于时间(shell 脚本会这样做),以您想要的方式记录您想要的数据。
为了扩展上一个答案,这是我刚刚写的一个具体的解决方案——也就是说,它在实践中肯定有效,而不仅仅是理论上,但它只被一个人使用了大约三分钟,所以它可能有一些不妥。
#!/bin/bash
{ time clang "$@"; } 2> >(cat <(echo "clang $@") - >> /tmp/results.txt)
我把上面两行放进去/tmp/time-clang
然后跑
chmod +x /tmp/time-clang
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang
make
您可以使用-DCMAKE_CXX_COMPILER=
完全相同的方式挂钩 C++ 编译器。
我没有使用
make -j8
,因为我不希望结果以奇怪的方式交错。我不得不
#!/bin/bash
在我的脚本上添加一个明确的 hashbang,因为 Ubuntu 12.04 上的默认 shell(dash
我认为是?)对这些重定向运算符不满意。
我认为最好的选择是使用:
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "time -v")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "time -v")
尽管上面已经说过:
请记住,直接使用“时间”是不可移植的,因为此实用程序并非在 CMake 支持的所有平台上都可用。但是,CMake 提供“时间”... https://stackoverflow.com/a/34888291/5052296
-v
如果您的系统包含它,则使用该标志您将获得更好的结果。
例如
time -v /usr/bin/c++ CMakeFiles/basic_ex.dir/main.cpp.o -o basic_ex
Command being timed: "/usr/bin/c++ CMakeFiles/basic_ex.dir/main.cpp.o -o basic_ex"
User time (seconds): 0.07
System time (seconds): 0.01
Percent of CPU this job got: 33%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.26
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 16920
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 6237
Voluntary context switches: 7
Involuntary context switches: 23
Swaps: 0
File system inputs: 0
File system outputs: 48
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0