将时间输出和它计时的命令写成一行
我试图计算我的代码库中每个文件需要多长时间才能编译的时间。将时间输出和它计时的命令写成一行
据this SO answer,你可以写一个脚本,做次实际编译,然后存储在一个文件中
/tmp/time-build
结果:
#!/bin/bash
{ time g++ "[email protected]"; } 2> >(cat <(echo "g++ [email protected]") - >> /tmp/results.txt)
然后,您可以覆盖CMAKE_CXX_COMPILER
调用cmake的时以便使用该脚本来执行汇编
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
时间,并将其上的G ++同一行命令。
问:
我的命令行拂达不到把这个任务:
{ time g++ "[email protected]"; } 2> >(cat <(echo "g++ [email protected]") - >> /tmp/results.txt)
进入仅仅捕捉时间的real
输出,包括它沿着命令一条线上的echo "g++ [email protected]"
。
我不知道是什么>(cat <(
和) -
份上述命令的意思的,我尝试结合了grep real
和echo
失败
我怎么能这样做?或者,如果有更习惯性的方法让cmake获得每个处理文件的输出时间,那也是理想的选择。
为基于CMake的项目获得编译时间的最好方法是使用ninja
而不是make
。
要做到这一点,你必须指定忍者发电机,同时配置:
cmake -G Ninja <...>
然后建立使用忍者:
ninja
之后,看看所谓.ninja_log
文件。第一列是以毫秒为单位的开始时间,第二列是结束时间,第四列是目标名称,最后一列是所用命令行的哈希。
甚至有一些解决方案可用于查看和分析此日志:ninjatracing将.ninja_log
转换为Chrome的跟踪工具可读的格式。
谢谢,会检查出来! –
cmd=(clang "[email protected]")
{ time "${cmd[@]}"; } 2> >(tee >(real=$(grep -Po 'real\K.*'); echo "${cmd[*]} $real" >>result.txt))
添加一点'sed'欺骗内联? –
@πάνταῥεῖ你能推荐一些吗? –
嗯,我的sed fu现在有点生疏了;-)。你有没有发现[相关](https://*.com/questions/5962285/cmake-compilation-statistics)问题? –