如何有效获取脚本的执行时间?

如何有效获取脚本的执行时间?

我想显示脚本的完成时间。

我目前所做的是——

#!/bin/bash
date  ## echo the date at start
# the script contents
date  ## echo the date at end

这只是显示脚本的开始和结束时间。是否可以显示细粒度的输出,例如处理器时间/ io 时间等?

答案1

time只需在调用脚本时使用:

time yourscript.sh

答案2

如果time不是一个选择,

start=`date +%s`
stuff
end=`date +%s`

runtime=$((end-start))

或者,如果您需要亚秒级精度并已bc安装,

start=`date +%s.%N`
stuff
end=`date +%s.%N`

runtime=$( echo "$end - $start" | bc -l )

答案3

只需致电times退出脚本时不带参数。

ksh或 一起zsh,您也可以使用time它来代替。除了之外zshtime还会为您提供挂钟时间用户系统CPU 时间。

要保留脚本的退出状态,您可以:

ret=$?; times; exit "$ret"

或者你也可以添加一个陷阱EXIT

trap times EXIT

这样,每当 shell 退出时都会调用 times 并保留退出状态。

$ bash -c 'trap times EXIT; : {1..1000000}'
0m0.932s 0m0.028s
0m0.000s 0m0.000s
$ zsh -c 'trap time EXIT; : {1..1000000}'
shell  0.67s user 0.01s system 100% cpu 0.677 total
children  0.00s user 0.00s system 0% cpu 0.677 total

还要注意bashkshzsh都有一个$SECONDS特殊变量,该变量每秒都会自动增加。在 和 中zshksh93该变量也可以设为浮点数(使用typeset -F SECONDS)以获得更高的精度。这只是挂钟时间,而不是 CPU 时间。

答案4

我有点晚了,但想发布我的解决方案(亚秒级精度),以防其他人碰巧通过搜索偶然发现这个线程。输出的格式为天、小时、分钟,最后是秒:

res1=$(date +%s.%N)

# do stuff in here

res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)

LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds

希望有人觉得这很有用!

[编辑] 您需要计算 bash printf 中字段定义中的所有字符,如果您想将秒数填充到点之前的 2 位数字,则必须将其定义为%07.4f(所有数​​字和点也计入字段长度),因此该行应如下所示: LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%07.4f\n" $dd $dh $dm $ds

相关内容