shell腳本示例:計算毫秒級、微秒級時間差

bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml


有時候須要計算命令的執行時間長度,可使用time命令,雖然time命令能夠精確到毫秒級,但time命令沒法計算一堆命令的執行時間。能夠直接使用date命令計算命令執行先後的時間差,但直接使用date命令計算時間差只能精確到秒級。所以,要計算毫秒級或者微秒級的時間長度,須要對date命令的結果進行一番計算轉換。shell

本文只給出了毫秒級時間差的計算方法,若要計算微秒級時間差,對腳本稍做修改便可。bash

腳本以下:lua

#!/bin/bash
###########################################################
#  description: get msec level time delay                 #
#  author     : 駿馬金龍                                   #
#  blog       : http://www.cnblogs.com/f-ck-need-u/       #
###########################################################

# filename: msec_diff.sh

function timediff() {

# time format:date +"%s.%N", such as 1502758855.907197692
    start_time=$1
    end_time=$2
    
    start_s=${start_time%.*}
    start_nanos=${start_time#*.}
    end_s=${end_time%.*}
    end_nanos=${end_time#*.}
    
 # end_nanos > start_nanos? 
    # Another way, the time part may start with 0, which means
    # it will be regarded as oct format, use "10#" to ensure
    # calculateing with decimal
    if [ "$end_nanos" -lt "$start_nanos" ];then
        end_s=$(( 10#$end_s - 1 ))
        end_nanos=$(( 10#$end_nanos + 10**9 ))
    fi
    
# get timediff
    time=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))`
    
    echo $time
}

#start=$(date +"%s.%N")
# Now exec some command
#end=$(date +"%s.%N")
# here give the values start=1502758855.907197692 end=1502758865.066894173
timediff $start $end

 執行該腳本:spa

[root@xuexi ~]# bash microsecond_diff.sh
9.159

可見結果精確到了毫秒級。3d

腳本說明:code

(1).爲了計算毫秒級時間差,因此使用date +"%s.%N"格式。其中"%s"是計算從1970-01-01 00:00:00到當前時間點通過的總秒數,因此計算兩個"%s"的差值就計算出了兩個時間點的秒級時間差。"%N"是每一個時間點的納秒部分,因爲date命令中沒法直接獲得精確到毫秒的時間,所以只能經過納秒來計算並轉換,因而兩個時間點的"%N"就能夠計算出納秒級的時間差。orm

但須要注意的是,計算納秒時間差時要考慮是否要將1秒轉換成10^9納秒,以確保納秒相減時必定獲得正數值。htm

(2)."%N"的納秒部分若是長度小於9,將以0補齊。例如999納秒,將補齊爲000000999。但在數學計算時,以0開頭的數值默認會被看成八進制計算,所以須要強行保證它以10進制計算,須要使用"10#"。數學表達式相關內容參見man bash的Arithmetic Evaluation部分。blog

(3).因爲date命令獲取到的%s和%N在同一字符串內,所以須要將其分割開來,在上述腳本中採用的是變量切分的方法。

(4).因爲納秒轉換成毫秒時," (end_nanos - start_nanos)/10**6 "的結果可能會忽略最前面的0,例如"(123456789-103456789)/10**6 = 20,表示20毫秒,在鏈接整數位和小數點時,須要用0補齊3位毫秒數,好比"1.020",因此上面加了一個printf。

相關文章
相關標籤/搜索