shell 计算统计程序的执行耗时,使用date和printf,输出格式为h:02m:02s.09nanoseconds
Linux种类繁多,命令支持可能不完整,因此应当尽量少用环境依赖。
该脚本编写时是在某一docker容器内执行的,主要使用了date
和printf
,注意这两个命令是否适配。
支持了时间差的计算,并将输出格式化为时分秒和 nanoseconds 。
calc-time-delta.sh
:
#!/bin/bash
# # $* : 参数列表
# echo $*
# # $# : 参数个数
# echo $#
#
# # date +"%F %T.%N" : 输出完整时间。%N:nanoseconds,9位,0补充。
# echo $(date +"%F %T.%N")
# # 转换时间戳。不含nanoseconds。
# echo $(date -d@123 +"%F %T")
#
# # $[...] : 数学计算
# echo $[1234 + 567]
#
# # printf -v VAR ... : 格式化输出到VAR
# printf -v VAR "%d.%09d" 123 456; echo ${VAR}
#
# # 单行显示
# VCMD=$*; VBEFORE=$(date +"%F %T.%N"); ${VCMD}; echo "after($(date +"%F %T.%N") - before(${VBEFORE})"
echo "calculation processing time."
if [ $# -eq 0 ] ; then
echo "Usage : $0 ...";
echo "example : $0 sleep 1";
exit
fi;
# process
VCMD=$*;
VBEFORE_INT=$(date +%s%N);
${VCMD}
VAFTER_INT=$(date +%s%N);
printf -v VBEFORE_STR "%s.%09d" $(date -d@$[${VBEFORE_INT} / (1000 * 1000 * 1000)] +"%F_%T") $[${VBEFORE_INT} % (1000 * 1000 * 1000)]
printf -v VAFTER_STR "%s.%09d" $(date -d@$[${VAFTER_INT} / (1000 * 1000 * 1000)] +"%F_%T") $[${VAFTER_INT} % (1000 * 1000 * 1000)]
# 需要手动格式化计算 # to h:02m:02s.09ns
VDELTA_INT=$[(${VAFTER_INT} - ${VBEFORE_INT})]
VDELTA_SECONDS_INT=$[${VDELTA_INT} / (1000 * 1000 * 1000)]
VDELTA_NS_INT=$[${VDELTA_INT} % (1000 * 1000 * 1000)]
printf -v VDELTA_STR "%d:%02d:%02d.%09d" $[${VDELTA_SECONDS_INT} / 60 / 60] $[${VDELTA_SECONDS_INT} / 60 % 60] $[${VDELTA_SECONDS_INT} % 60] ${VDELTA_NS_INT}
echo "delta(${VDELTA_STR}) = after(${VAFTER_STR}) - before(${VBEFORE_STR})"
output :
root@docker-desktop:~# ./calc-time-delta.sh
calculation processing time.
Usage : ./calc-time-delta.sh ...
example : ./calc-time-delta.sh sleep 1
root@docker-desktop:~# ./calc-time-delta.sh sleep 1
calculation processing time.
delta(00:00:01.004122645) = after(2023-11-09_12:15:29.525595899) - before(2023-11-09_12:15:28.521473254)
root@docker-desktop:~#