在bash中,如何分析我脚本某些部分的运行时间?

Jac*_*kWM 3 bash shell

在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));
...
Run Code Online (Sandbox Code Playgroud)

如何在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}'
Run Code Online (Sandbox Code Playgroud)

我想分别分析累计的head/tail时间和accuracy.sh tmp1 tmp2时间.

sam*_*hen 6

您可以使用适当命名的time命令为希望时间的命令添加前缀.

例如:

time find . -type f -name hello_world.cc
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

time head -$((i+step)) $1 | tail -$step > tmp1
time head -$((i+step)) $2 | tail -$step > tmp2
time setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
Run Code Online (Sandbox Code Playgroud)

注意,时间输出到tty,所以你不必担心时间的结果被写入tmp1tmp2等.

如果您想要查看实时更新的总耗用时间(自脚本开始运行以来),您可以执行以下操作:

在脚本开始时,请记下系统时间:

start_timestamp=$(date +%s)
Run Code Online (Sandbox Code Playgroud)

然后启动你的实际脚本main:

# Do your execution here
Run Code Online (Sandbox Code Playgroud)

然后在你的循环中,无论你希望看到到目前为止经过的时间输出

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