zoukankan      html  css  js  c++  java
  • shell脚本示例:计算毫秒级、微秒级时间差

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


    有时候需要计算命令的执行时间长度,可以使用time命令,虽然time命令可以精确到毫秒级,但time命令无法计算一堆命令的执行时间。可以直接使用date命令计算命令执行前后的时间差,但直接使用date命令计算时间差只能精确到秒级。因此,要计算毫秒级或者微秒级的时间长度,需要对date命令的结果进行一番计算转换。

    本文只给出了毫秒级时间差的计算方法,若要计算微秒级时间差,对脚本稍作修改即可。

    脚本如下:

    #!/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
    " $(( (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

     执行该脚本:

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

    可见结果精确到了毫秒级。

    脚本说明:

    (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。

  • 相关阅读:
    jdbc的入门学习
    java代码生成Excel文件3000条自定义属性的的域账户名
    java面试题
    node图片资源捉取
    运用node真机调试移动web项目
    node读取文件转换json文件
    微信小程序页面导航功能
    JavaScript值全等判断
    微信小程序海报生成功能
    JavaScript常用数组操作方法,包含ES6方法
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/7426987.html
Copyright © 2011-2022 走看看