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
<span style="font-size: 13.3333px;">调试4(有错误):</span>
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.csdn.net/foxliucong/article/details/4225008

【2】 http://blog.csdn.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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值