在bash中,如何对脚本的某个部分进行时间分析?

3
在Java程序中,我通常使用以下函数来记录时间信息:
...
long start = System.currentTimeMillis();
...
...
System.out.println("elapsed time 1: "+(System.currentTimeMills() - start));
...
...
start = System.currentTimeMillis();
...
System.out.println("elapsed time 2: "+(System.currentTimeMills() - start));
...

如何在shell bash中实现类似的功能?此外,如果有循环,如何收集累计时间?
例如:
for ((i=0;i<$lines;i=i+$step))
do    
    head -$((i+step)) $1 | tail -$step > tmp1
    head -$((i+step)) $2 | tail -$step > tmp2
    setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
done
echo $setstr | awk '{for (i=1;i<=NF;i++) sum+=$i; }END{print sum/NF}'

我希望能够分别记录 head/tail 时间和 accuracy.sh tmp1 tmp2 时间。


这个答案可能会有帮助:https://dev59.com/D2445IYBdhLWcg3wJ298#5015179 - Olaf Dietsche
1个回答

7
你可以在你希望计时的命令前加上名为time的命令。
例如:
time find . -type f -name hello_world.cc

在您的情况下:
time head -$((i+step)) $1 | tail -$step > tmp1
time head -$((i+step)) $2 | tail -$step > tmp2
time setstr=$setstr' '`./accuracy.sh tmp1 tmp2`

请注意,时间输出到 tty ,因此您不必担心计时结果被写入 tmp1tmp2 等文件中。
如果您想要实时观察自脚本开始运行以来的总耗时,请执行以下操作:
在脚本开始时,记录系统时间:
start_timestamp=$(date +%s)

然后开始您实际的脚本主程序:
# Do your execution here

然后在您的循环内部,无论何时想要查看到目前为止经过的时间输出

curr_timestamp=$(date +%s)
elapsed_time=$(expr $end_time - $start_time)
echo "Elapsed: $elapsed_time" >> elapsed_time.log

1
好的解释。然后,如何收集累计时间? - JackWM
如果你所说的累计时间是指脚本的总运行时间,那么你可以使用 time ./my_script_name 命令。如果你想要看到一个类似秒表的已经流逝时间信息更新,可以看一下我稍后编辑的帖子。 - sampson-chen
我指的是每个部分的累计时间,而不是总时间。 - JackWM
我能创建一个变量 sum_elapsed_time 并像这样操作吗 sum_elapsed_time += elapsed_time - JackWM
@JackWM 你可以这样写,语法如下:sum_elapsed_time=$((sum_elapsed_time + elapsed_time)) - sampson-chen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接