将时间输出和时间输出写为单行

时间:2017-06-29 14:15:01

标签: bash cmake

我正在尝试计算代码库中每个文件编译的时间。

根据this SO answer,您可以编写一个脚本,该脚本执行实际编译的次数,然后将结果存储在文件中

/tmp/time-build

#!/bin/bash
{ time g++ "$@"; } 2> >(cat <(echo "g++ $@") - >> /tmp/results.txt)

然后,您可以在调用cmake时覆盖CMAKE_CXX_COMPILER,以便make使用脚本执行编译

cmake .. -DCMAKE_CXX_COMPILER=/tmp/time-build
make

这与宣传的一样,并产生类似于以下内容的结果:

real    0m1.190s
user    0m1.044s
sys     0m0.140s
g++ -Werror -Wall -Wextra ... /src/test/foo.cpp

但是,为了简化处理,我想只存储real时间,并将其与命令保持在同一行

问题:

我的命令行fu无法解决这个问题:

{ time g++ "$@"; } 2> >(cat <(echo "g++ $@") - >> /tmp/results.txt)

进入一个仅捕获real时间输出的命令,并将其与echo "g++ $@"一起包含在一行中。

我不知道上述命令的>(cat <() -部分是什么意思,我尝试合并grep realecho失败了

我该怎么做?

或者,如果有一种更惯用的方法来让cmake为每个处理过的文件输出时间,那也是理想的。

2 个答案:

答案 0 :(得分:3)

为基于CMake的项目获取编译时间的最佳方法可能是使用ninja而不是make

为此,您必须在配置时指定忍者生成器:

cmake -G Ninja <...>

然后使用忍者构建:

ninja

之后,查看名为.ninja_log的文件。第一列是以毫秒为单位的开始时间,第二列是结束时间,第四列是目标名称,最后一列是使用的命令行的哈希值。

甚至还有一些查看和分析此日志的解决方案:ninjatracing.ninja_log转换为Chrome浏览器工具可读的格式。

答案 1 :(得分:1)

cmd=(clang "$@")
{ time "${cmd[@]}"; } 2> >( tee >( real=$(grep -Po 'real\K.*'); echo "${cmd[*]} $real" >>result.txt ) )