我正在尝试计算代码库中每个文件编译的时间。
根据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 real
和echo
失败了
我该怎么做?
或者,如果有一种更惯用的方法来让cmake为每个处理过的文件输出时间,那也是理想的。
答案 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 ) )