脚本的时间部分(运行 时间)

time part of a script (running time)

使用 time script.sh 您将获得 运行 脚本所花费的时间,但是如果您想对脚本的一部分计时?

假设我想测试一个循环需要多长时间,我可以使用 $SECONDS 函数,但是有没有计算毫秒的计时器?

例如在一个长代码的中间:

    timerstart
    until [[ $loop -eq 10000 ]]; do
     ((++loop))

    echo "annoying"
    done
    timerstop

然后在脚本的末尾,我只添加 echo $timerresult ,它会显示 运行 只用了多少毫秒选择的代码,而不是脚本的其余部分

我正在寻找这个解决方案,以便我可以测试部分脚本是否“缓慢”。 这可以解决吗?

您可以使用

date '+%s.%N'

以纳秒精度获取当前时间。

#!/bin/bash
start=$(date '+%s.%N')
until [[ $loop -eq 10000 ]]; do
    ((++loop))
    
    echo "annoying"
done
stop=$(date '+%s.%N')
bc <<< $stop-$start

对于 Bash 5.0 及更高版本,您可以使用 $EPOCHREALTIME:

[...] it expands to the number of seconds since the Unix Epoch as a floating point value with micro-second granularity [...]

start=$EPOCHREALTIME
for ((i = 0; i < 10000; ++i)); do
    echo "annoying"
done
stop=$EPOCHREALTIME

elapsed=$(bc -l <<< "$stop - $start")

您也可以在脚本中为各个部分使用 time,例如为循环计时:

time until [[ $loop -eq 10000 ]]; do
 ((++loop))

 echo "annoying"
done

或者用大括号组来计时一组命令:

time {
 until [[ $loop -eq 10000 ]]; do
  ((++loop))
 done

 echo "Other commands here that are also timed"
}

将循环放入函数中。

#!/bin/bash
myloop() {
    loop=1
    until [[ $loop -eq 10000 ]]; do
       ((++loop))
       echo "annoying"
    done
}

time myloop