我想显示脚本的完成时间。
我目前正在做的是-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
这只是显示脚本开始和结束的时间。是否可以显示细粒度的输出,例如处理器时间/ io时间等?
我想显示脚本的完成时间。
我目前正在做的是-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
这只是显示脚本开始和结束的时间。是否可以显示细粒度的输出,例如处理器时间/ io时间等?
Answers:
只需time
在调用脚本时使用:
time yourscript.sh
time $( ... ) >> out.txt
time (command1 && command2)
如果time
不是一种选择,
start=`date +%s`
stuff
end=`date +%s`
runtime=$((end-start))
date
例如,您仍然要调用两次,因此实际上最多只能获得毫秒精度,甚至可能更低),请尝试使用date +%s.%N
。(%N
自整秒以来为纳秒。)
date +%s%N
,或使用更有能力的东西,bc
如jwchew建议的那样根据这两个值来计算实际运行时间。不过,我仍然认为这种方法不是最理想的方法。time
由于上述原因,如果有的话,它要好得多。
bc
然后执行以下操作:runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
times
退出脚本时不带参数就调用。
使用ksh
或zsh
,也可以使用time
。使用zsh
,time
除了用户和系统 CPU时间以外,还将为您提供挂钟时间。
要保留脚本的退出状态,可以执行以下操作:
ret=$?; times; exit "$ret"
或者,您也可以在上添加一个陷阱EXIT
:
trap times EXIT
这样,只要shell退出,时间就会被调用,并且退出状态将被保留。
$ 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
还要注意的是所有的bash
,ksh
并zsh
有$SECONDS
自动递增得到每秒特殊变量。在zsh
和中ksh93
,还可以将该变量设置为浮点数(使用typeset -F SECONDS
),以提高精度。这只是挂钟时间,不是CPU时间。
time
接近前面介绍的方法。我认为timeit
MATLAB代码中介绍的方法在这里很有用。
times
没有花时间,对吗?例如,bash -c 'trap times EXIT;sleep 2'
我对这个潮流有点迟了,但是想发布我的解决方案(以亚秒为单位的精度),以防其他人偶然通过搜索偶然发现此线程。输出的格式为天,小时,分钟,最后是秒:
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)
printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
希望那里的人觉得有用!
date
不支持亚秒级精度,而只会N
在时间戳后附加文字“ ”。
dt2=$(echo "$dt%86400" | bc)
。只是说...顺便说一句,我更喜欢这种形式,dt2=$(bc <<< "${dt}%86400")
但这完全是个人的。
#!/bin/bash
start=$(date +%s.%N)
# HERE BE CODE
end=$(date +%s.%N)
runtime=$(python -c "print(${end} - ${start})")
echo "Runtime was $runtime"
是的,这调用了Python,但是如果您可以接受,那么这是一个很好的简洁解决方案。
python
在大多数当前系统中,在子外壳中运行该命令并读取其输出将花费数百万个纳秒。跑步也一样date
。
这个问题已经很老了,但是在尝试找到我最喜欢的方法时,这个线程出现了很多问题……令我惊讶的是,没有人提到它:
perf stat -r 10 -B sleep 1
“ perf”是性能分析工具,包含在内核的“ tools / perf”下,通常可以单独安装(在CentOS中为“ perf”,在Debian / Ubuntu中为“ linux-tools”)。 Linux Kernal perf Wiki拥有有关它的更多信息。
运行“ perf stat”会给出很多细节,包括最后的平均执行时间:
1.002248382 seconds time elapsed ( +- 0.01% )
perf
啊
perf stat
现在抱怨“您可能没有收集统计信息的权限”。除非您使用来运行一些命令,否则sudo
这将在您不完全拥有目标计算机的所有情况下使它无效。
可以在命令之前添加一个小的shell函数以测量其时间:
tm() {
s=$(date +%s)
$@
rc=$?
echo "took $[$(date +%s)-$s] seconds. return code $rc" >&2
return $rc
}
然后在脚本或命令行中使用它,如下所示:
tm the_original_command with all its parameters
s=$(date +%s000)
,不确定是否可行。
#!/bin/csh
#PBS -q glean
#PBS -l nodes=1:ppn=1
#PBS -l walltime=10:00:00
#PBS -o a.log
#PBS -e a.err
#PBS -V
#PBS -M shihcheng.guo@gmail.com
#PBS -m abe
#PBS -A k4zhang-group
START=$(date +%s)
for i in {1..1000000}
do
echo 1
done
END=$(date +%s)
DIFF=$(echo "$END - $START" | bc)
echo "It takes DIFF=$DIFF seconds to complete this task..."
date
在脚本之前和之后使用的其他答案有什么实际区别,并输出它们之间的区别?
仅使用bash,也可以测量和计算一部分Shell脚本的持续时间(或整个脚本的经过时间):
start=$SECONDS
... # do time consuming stuff
end=$SECONDS
您现在可以只打印差异:
echo "duration: $((end-start)) seconds."
如果只需要增加持续时间,请执行以下操作:
echo "duration: $((SECONDS-start)) seconds elapsed.."
您还可以将持续时间存储在变量中:
let diff=end-start
#!/bin/bash
begin=$(date +"%s")
Script
termin=$(date +"%s")
difftimelps=$(($termin-$begin))
echo "$(($difftimelps / 60)) minutes and $(($difftimelps % 60)) seconds elapsed for Script Execution."
基于的计时功能SECONDS
仅限于二级粒度,不使用任何外部命令:
time_it() {
local start=$SECONDS ts ec
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Starting $*"
"$@"; ec=$?
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Finished $*; elapsed = $((SECONDS-start)) seconds"
# make sure to return the exit code of the command so that the caller can use it
return "$ec"
}
例如:
time_it sleep 5
给
2019-03-30_17:24:37 Starting sleep 5 2019-03-30_17:24:42 Finished
sleep 5; elapsed = 5 seconds