2017-06-29 75 views
2

我试图计算我的代码库中每个文件需要多长时间才能编译的时间。将时间输出和它计时的命令写成一行

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 realecho失败

我怎么能这样做?或者,如果有更习惯性的方法让cmake获得每个处理文件的输出时间,那也是理想的选择。

+1

添加一点'sed'欺骗内联? –

+0

@πάνταῥεῖ你能推荐一些吗? –

+0

嗯,我的sed fu现在有点生疏了;-)。你有没有发现[相关](https://stackoverflow.com/questions/5962285/cmake-compilation-statistics)问题? –

回答

3

为基于CMake的项目获得编译时间的最好方法是使用ninja而不是make

要做到这一点,你必须指定忍者发电机,同时配置:

cmake -G Ninja <...> 

然后建立使用忍者:

ninja 

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

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

+0

谢谢,会检查出来! –

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