cmake:每个事务单元的编译统计信息

von4xj4u  于 2023-04-06  发布在  其他
关注(0)|答案(4)|浏览(182)

我需要弄清楚哪些翻译单元需要重新构造以缩短编译时间,如何使用cmake为我的翻译单元获得编译时间?

envsm3lx

envsm3lx1#

以下属性可用于计算编译器和链接器调用的时间:

这些属性可以全局设置,每个目录和每个目标。这样你就只能让你的目标的一个子集(比如测试)受到这个属性的影响。此外,你可以为每个目标设置不同的“启动器”,这也可能是有用的。
请记住,直接使用“time”是不可移植的,因为此实用程序并不适用于CMake支持的所有平台。但是,CMake在其命令行工具模式中提供了“time”功能。例如:

# 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.4 cmake -E time在参数中有空格的问题。例如:

cmake -E time cmake "-GUnix Makefiles"

将被解释为:

cmake -E time cmake "-GUnix" "Makefiles"

我提交的patch解决了这个问题。

jdgnovmf

jdgnovmf2#

我希望用'time original-cmd'替换编译器(和/或链接器)。使用普通的'make',我会说:

make CC="time gcc"

'time'程序将运行命令并报告所用的时间。等效的机制将与'cmake'一起工作。如果您需要捕获命令和时间,那么您可以编写自己的类似于time的命令(shell脚本可以),以您想要的方式记录数据。

dnph8jn4

dnph8jn43#

为了扩展前面的答案,这里有一个我刚刚写的具体解决方案-也就是说,它在实践中肯定有效,而不仅仅是在理论上,但它只被一个人使用了大约三分钟,所以它可能有一些错误。

#!/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,因为我不希望结果以奇怪的方式交错。
  • 我不得不在我的脚本中放置一个显式的hashbang #!/bin/bash,因为Ubuntu 12.04上的默认shell(我想是dash吧?)对这些重定向操作符不满意。
0vvn1miw

0vvn1miw4#

我认为最好的选择是用途:

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "time -v")
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "time -v")

尽管上面已经说过:
请记住,直接使用“time”是不可移植的,因为此实用程序并非在CMake支持的所有平台上都可用。但是,CMake提供了“time”... 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

相关问题