cmake:汇编统计

Has*_*yed 14 c++ compilation cmake build-tools

我需要弄清楚哪些翻译单元需要重组以改善编译时间,如何使用cmake来控制编译时间?

won*_*ice 24

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

可以全局,按目录和每个目标设置这些属性.这样,您只能让目标的一部分(比如测试)受到此属性的影响.此外,您可以为每个目标使用不同的"发射器",它们也很有用.

请记住,直接使用"time"是不可移植的,因为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")
Run Code Online (Sandbox Code Playgroud)

示例CMake输出:

[ 65%] Built target my_target
[ 67%] Linking C executable my_target
Elapsed time: 0 s. (time), 0.000672 s. (clock)
Run Code Online (Sandbox Code Playgroud)

请注意,从CMake 3.4开始,只有Makefile和Ninja生成器支持此属性.

另请注意,从CMake 3.4 cmake -E time开始,参数中的空格存在问题.例如:

cmake -E time cmake "-GUnix Makefiles"
Run Code Online (Sandbox Code Playgroud)

将被解释为:

cmake -E time cmake "-GUnix" "Makefiles"
Run Code Online (Sandbox Code Playgroud)

我提交了补丁修复了这个问题.


Jon*_*ler 10

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

make CC="time gcc"
Run Code Online (Sandbox Code Playgroud)

'时间'程序将运行命令并报告所花费的时间.等效机制适用于'cmake'.如果您需要捕获命令以及时间,那么您可以编写自己的命令,类似于时间(shell脚本会这样做),以您想要的方式记录您想要的数据.


Quu*_*one 7

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

#!/bin/bash
{ time clang "$@"; } 2> >(cat <(echo "clang $@") - >> /tmp/results.txt)
Run Code Online (Sandbox Code Playgroud)

我把上面两行放进去/tmp/time-clang然后跑

chmod +x /tmp/time-clang
cmake .. -DCMAKE_C_COMPILER=/tmp/time-clang
make
Run Code Online (Sandbox Code Playgroud)

您可以使用-DCMAKE_CXX_COMPILER=完全相同的方式来挂钩 C++ 编译器。

  • 我没有使用,make -j8因为我不希望结果以奇怪的方式交错。

  • 我不得不#!/bin/bash在我的脚本上放置一个显式的 hashbang ,因为dashUbuntu 12.04 上的默认 shell(我认为?)对这些重定向运算符不满意。