我希望找出一个Linux Shell脚本需要花费多长时间。我怎样才能做到这一点?
Answers:
使用time
命令。time ls /bin
。
time
是不适合的时正在执行复杂的指令序列
time (ls / ; sleep 2; ls /bin)
。
\
,()
它将变得更加复杂。
/usr/bin/time -f '%C => %E' (ls / ; sleep 2; ls /bin)
抛出bash: syntax error near unexpected token '('
请尝试以下示例:
START_TIME=$SECONDS
# do something
sleep 65
ELAPSED_TIME=$(($SECONDS - $START_TIME))
echo "$(($ELAPSED_TIME/60)) min $(($ELAPSED_TIME%60)) sec"
#> 1 min 5 sec
许多答案都提到了$SECONDS
这个变量,但实际上它比他们意识到的还要好:
分配给该变量会将计数重置为分配的值,并且扩展后的值将成为分配的值加上分配以来的秒数。
这意味着您可以直接在脚本结尾直接查询此变量以显示经过的时间:
#!/usr/bin/env bash
# Do stuff...
echo "Script finished in $SECONDS seconds."
您还可以为较小的部分设置时间,如下所示:
#!/usr/bin/env bash
# Do stuff
SECONDS=0
# Do timed stuff...
echo "Timed stuff finished in $SECONDS seconds."
GNU time
我对GNUtime
命令也很感兴趣:https : //www.gnu.org/software/time/与time
内置的Bash相比,它提供了一些重要的选项。
用法示例:
env time --format '%e' --output time.log sleep 1
输出:
1.00
说明:
env
:查找/usr/bin/time
而不是内置的Bash
--format '%e'
:以秒为单位的打印时间,请参见man time
。
基准测试时通常是我想要的:一个数字,而不是分钟+秒。
我经常使用的一个重要模式是:
bench-cmd() (
logfile=time.log
echo "cmd $@" >> "$logfile"
printf 'time ' >> "$logfile"
bench_cmd="env time --append --format '%e' --output '$logfile' $@"
eval "$bench_cmd"
echo >> "$logfile"
)
rm -f time.log
bench-cmd sleep 1
bench-cmd sleep 2
bench-cmd sleep 3
cat time.log
输出:
cmd sleep 1
time 1.00
cmd sleep 2
time 2.00
cmd sleep 3
time 3.00
说明:
--output
:将时间输出到文件。
默认情况下,输出到达stderr,因此此选项对于将时序与命令的stderr分开很重要。
--append
:追加到文件而不是覆盖。
这使我可以将整个基准测试输出集中在一个文件中。
SECONDS
,则它不再具有特殊的含义)。请参阅POSIX规范@ pubs.opengroup.org / onlinepubs / 9699919799 / basedefs/…,保留小写字母供应用程序使用,请牢记shell和环境变量共享一个名称空间-保留包含小写字母的环境变量名称的名称空间适用于应用程序。