linux脚本实现毫秒计时,Linux学习2之shell脚本计算代码段运行的时间(精确到毫秒)...

简洁且成功的代码:

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh

#!/bin/bash

startTime=`date +"%s.%N"`

#bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai

for((i=1;i<=400;i++));do echo $(expr $i \* 4);done

endTime=`date +"%s.%N"`

echo `awk -v x1="$(echo $endTime | cut -d '.' -f 1)" -v x2="$(echo $startTime | cut -d '.' -f 1)" -v y1="$[$(echo $endTime | cut -d '.' -f 2) / 1000]" -v y2="$[$(echo $startTime | cut -d '.' -f 2) /1000]" 'BEGIN{printf "RunTIme:%.6f s",(x1-x2)+(y1-y2)/1000000}'`

运行结果1:

... ...

1568

1572

1576

1580

1584

1588

1592

1596

1600

RunTIme:0.505397 s

运行结果2(需要配置bwa程序):

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh

[bwa_aln] 17bp reads: max_diff = 2

[bwa_aln] 38bp reads: max_diff = 3

[bwa_aln] 64bp reads: max_diff = 4

[bwa_aln] 93bp reads: max_diff = 5

[bwa_aln] 124bp reads: max_diff = 6

[bwa_aln] 157bp reads: max_diff = 7

[bwa_aln] 190bp reads: max_diff = 8

[bwa_aln] 225bp reads: max_diff = 9

[main] Version: 0.7.12-r1039

[main] CMD: bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq

[main] Real time: 36.195 sec; CPU: 3.575 sec

RunTIme:36.265438 s可以看出来调用程序时间稍大于程序内部自己内测时间,正常。

程序说明:

startTimeS1=$(echo $startTime | cut -d '.' -f 1)

startTimeS2=$[$(echo $startTime | cut -d '.' -f 2) /1000]

endTimeS1=$(echo $endTime | cut -d '.' -f 1)

endTimeS2=$[$(echo $endTime | cut -d '.' -f 2) / 1000]

详细可参考最后一个调试(调试5)

总结:参考指令

awk

|bc

expr

$[]

毫秒和纳秒时间可调。

可以忽略一下,仅自己参考、记录

调试1(有错误):

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh

#!/bin/bash

startTime=`date +"%Y-%m-%d %H:%M:%S.%N"`

for((i=1;i<=10;i++));do echo $(expr $i \* 4);done

endTime=`date +"%Y-%m-%d %H:%M:%S.%N"`

echo "startTime "$startTime

echo "endTime "$endTime

startTimeS1=$(echo $startTime | cut -d '.' -f 1)

startTimeS2=$(echo $startTime | cut -d '.' -f 2)

#startTimeS1= cut -d '.' -f 1 $startTime

#startTimeS2= cut -d '.' -f 2 $endTime

endTimeS1=$(echo $endTime | cut -d '.' -f 1)

endTimeS2=$(echo $endTime | cut -d '.' -f 2)

echo $startTimeS1

echo $endTimeS1

echo $startTimeS2

echo $endTimeS2

startTimeS1Linux=`date -d "$startTimeS1" +%s` #把当前时间转化为Linux时间

endTimeS1Linux=`date -d "$endTimeS1" +%s`

startTimeS2Linux=`date -d "$startTimeS2" +%s` #把当前时间转化为Linux时间

endTimeS1L2nux=`date -d "$endTimeS2" +%s`

echo $startTimeS1Linux

echo $endTimeS1Linux

echo $startTimeS2Linux

echo $endTimeS2Linux

s=`expr $endTimeS1Linux - $startTimeS1Linux` #计算2个时间的差

#ns=`expr $endTimeS2Linux - $startTimeS2Linux` #计算2个时间的差

ns=`expr $endTimeS2 - $startTimeS2` #计算2个时间的差

echo $s.$ns运行结果:

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh

4

8

12

16

20

24

28

32

36

40

startTime 2016-03-14 21:46:10.065302995

endTime 2016-03-14 21:46:10.078381939

2016-03-14 21:46:10

2016-03-14 21:46:10

065302995

078381939

date: invalid date ‘065302995’

date: invalid date ‘078381939’

1457963170

1457963170

0.13078944

调试2(有错误):

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh

#!/bin/bash

startTime=`date +"%Y-%m-%d %H:%M:%S.%N"`

for((i=1;i<=10;i++));do echo $(expr $i \* 4);done

endTime=`date +"%Y-%m-%d %H:%M:%S.%N"`

startTimeS1=$(echo $startTime | cut -d '.' -f 1)

startTimeS2=$(echo $startTime | cut -d '.' -f 2)

endTimeS1=$(echo $endTime | cut -d '.' -f 1)

endTimeS2=$(echo $endTime | cut -d '.' -f 2)

startTimeS1Linux=`date -d "$startTimeS1" +%s` #把当前时间转化为Linux时间

endTimeS1Linux=`date -d "$endTimeS1" +%s`

echo "RunTime:"`expr $endTimeS1Linux - $startTimeS1Linux`.`expr $endTimeS2 - $startTimeS2`"s"输出:

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh

4

8

12

16

20

24

28

32

36

40

RunTime:0.13458804s调试3(有错误):

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh

#!/bin/bash

startTime=`date +"%s.%N"`

for((i=1;i<=10;i++));do echo $(expr $i \* 4);done

endTime=`date +"%s.%N"`

startTimeS1=$(echo $startTime | cut -d '.' -f 1)

startTimeS2=$(echo $startTime | cut -d '.' -f 2)

endTimeS1=$(echo $endTime | cut -d '.' -f 1)

endTimeS2=$(echo $endTime | cut -d '.' -f 2)

echo "RunTime:"`expr $endTimeS1 - $startTimeS1`.`expr $endTimeS2 - $startTimeS2`"s"输出:

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh

4

8

12

16

20

24

28

32

36

40

RunTime:0.13124421s调试4(有错误):hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh

#!/bin/bash

startTime=`date +"%s.%N"`

for((i=1;i<=10;i++));do echo $(expr $i \* 4);done

endTime=`date +"%s.%N"`

echo "RunTime:"`expr $(echo $endTime | cut -d '.' -f 1) - $(echo $startTime | cut -d '.' -f 1)`.`expr $(echo $endTime | cut -d '.' -f 2) - $(echo $startTime | cut -d '.' -f 2)`"s"输出:

hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh

4

8

12

16

20

24

28

32

36

40

RunTime:0.13331374s

前面几种没有考虑结束的纳秒比开始的纳秒小,会出现负数,故需要修改:

调试5(有错误):

#!/bin/bash

#echo "hello"

#bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai

startTime=`date +"%s.%N"`

bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai

# for((i=1;i<=400;i++));do echo $(expr $i \* 4);done

endTime=`date +"%s.%N"`

echo "startTime "$startTime

echo "endTime "$endTime

startTimeS1=$(echo $startTime | cut -d '.' -f 1)

startTimeS2=$[$(echo $startTime | cut -d '.' -f 2) /1000]

endTimeS1=$(echo $endTime | cut -d '.' -f 1)

endTimeS2=$[$(echo $endTime | cut -d '.' -f 2) / 1000]

#echo $Scha

#echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "product0:1-%f,2-%.3f,sum-%.3f",x1-x2,y1-y2,(x1-x2)+(y1/1000-y2/1000)}'`

echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.6f s",(x1-x2)+(y1-y2)/1000000}'`

#echo $product0

#if [ $endTimeS2 -lt $startTimeS2 ]; then

# echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.3f s",(x1-x2)+(y1/1000-y2/1000)}'`

#echo 'awk -v x="$endTime" 'BEGIN{printf("%f",x*2}''

#echo "scale=3;$[$[$endTimeS2-1]-$startTimeS2]+$s2" |bc

#echo "RunTime:" $ $[$(echo $endTime | cut -d '.' -f 1)-1] - $(echo $startTime | cut -d '.' -f 1) + $[$( $[ $(echo $endTime | cut -d '.' -f 2)+1000000000] - $(echo $startTime | cut -d '.' -f 2)) / 10000000 ]"s"

#else

#echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.3f s",(x1-x2-1)+(y1/1000-y2/1000)}'`

#echo "RunTime:" $[$[$endTimeS2-1]-$startTimeS2].$[$[$[$endTimeS1+1000]-$statTimeS1] / 1000]

#echo "RunTime:"`expr $(echo $endTime | cut -d '.' -f 1) - $(echo $startTime | cut -d '.' -f 1)`.`expr $(echo $endTime | cut -d '.' -f 2) - $(echo $startTime | cut -d '.' -f 2)`"s"

#fi

# exec_time_ms=$[$[$[ 10#$(echo $endTime | cut -d '.' -f 1) - 10#$(echo $startTime | cut -d '.' -f 1)] * 1000] + $[$[10#$(echo $endTime | cut -d '.' -f 2) / 1000000] - $[10#$(echo $startTime | cut -d '.' -f 2) / 1000000] ] ]

# nowdate=`date +%Y%m%d-%T`

# echo "--------$nowdate-------->":$exec_time_ms

#current=`date "+%Y-%m-%d %H:%M:%S"` #获取当前时间,例:2015-03-11 12:33:41

#timeStamp=`date -d "$current" +%s` #将current转换为时间戳,精确到秒

#currentTimeStamp=$((timeStamp*1000+`date "+%N"`/1000000)) #将current转换为时间戳,精确到毫秒

#echo $currentTimeStamp

shell运算参考:【4】

虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。

另外,我们在 script 中经常有加1操作,以下四法皆可:

m=$[ m + 1]

m=`expr $m + 1`

m=$(($m + 1))

let m=m+1

另外,还可以使用bc

m=`echo "( $a - 1 )*$b +1" |bc`

参考文献:

【1】  http://blog..net/foxliucong/article/details/4225008

【2】 http://blog..net/gengshenghong/article/details/7583580

【3】 http://blog.sina.com.cn/s/blog_9d074aae01012ytf.html

【4】 http://blog.chinaunix.net/uid-209416-id-2410742.html

【5】http://blog.jobbole.com/92430/

【6】http://www.centoscn.com/shell/2013/0802/884.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值