Shell计算毫秒级、微秒级时间差
Shell计算毫秒级、微秒级时间差
有时候需要计算命令的执行时间长度,可以使用time命令,虽然time命令可以精确到毫秒级,但time命令无法计算一堆命令的执行时间。可以直接使用date命令计算命令执行前后的时间差,但直接使用date命令计算时间差只能精确到秒级。因此,要计算毫秒级或者微秒级的时间长度,需要对date命令的结果进行一番计算转换。
本文只给出了毫秒级时间差的计算方法,若要计算微秒级时间差,对脚本稍作修改即可。
脚本如下:
1 | #!/bin/bash |
执行该脚本:
1 | [root@xuexi ~]# bash microsecond_diff.sh |
可见结果精确到了毫秒级。
脚本说明:
(1).为了计算毫秒级时间差,所以使用date +"%s.%N"
格式。其中%s
是计算从1970-01-01 00:00:00到当前时间点经过的总秒数,所以计算两个%s
的差值就计算出了两个时间点的秒级时间差。%N
是每个时间点的纳秒部分,由于date命令中无法直接得到精确到毫秒的时间,因此只能通过纳秒来计算并转换,于是两个时间点的%N
就可以计算出纳秒级的时间差。
但需要注意的是,计算纳秒时间差时要考虑是否要将1秒转换成10^9
纳秒,以确保纳秒相减时一定得到正数值。
(2).%N
的纳秒部分如果长度小于9,将以0补齐。例如999纳秒,将补齐为000000999。但在数学计算时,以0开头的数值默认会被当作八进制计算,因此需要强行保证它以10进制计算,需要使用10#
。数学表达式相关内容参见man bash
的【Arithmetic Evaluation】部分。
(3).由于date命令获取到的%s
和%N
在同一字符串内,因此需要将其分割开来,在上述脚本中采用的是变量切分的方法。
(4).由于纳秒转换成毫秒时,(end_nanos - start_nanos)/10**6
的结果可能会忽略最前面的0,例如(123456789-103456789)/10**6 = 20
,表示20毫秒,在连接整数位和小数点时,需要用0补齐3位毫秒数,比如”1.020”,所以上面加了一个printf。