1. 程式人生 > >Linux學習2之shell指令碼計算程式碼段執行的時間(精確到毫秒)

Linux學習2之shell指令碼計算程式碼段執行的時間(精確到毫秒)

簡潔且成功的程式碼:

[email protected]:~/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程式):

[email protected]:~/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(有錯誤):

[email protected]:~/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

執行結果:
[email protected]:~/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(有錯誤):

[email protected]:~/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"
輸出:
[email protected]:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh 
4
8
12
16
20
24
28
32
36
40
RunTime:0.13458804s

除錯3(有錯誤):
[email protected]:~/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"
輸出:
[email protected]:~/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>
[email protected]:~/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"


輸出:
[email protected]:~/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

相關推薦

Linux學習2shell指令碼計算程式碼執行時間精確毫秒

簡潔且成功的程式碼: [email protected]:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh #!/bin/bash startTime=`date +"%s.%N"` #bwa aln .

C語言 計算/測程式執行時間精確到微秒

 平臺:VS2010 #include<stdio.h> #include <Windows.h> int main() { int a[10002]; int i = 0; double run_time; LARGE_INTEGER time_sta

Linux學習基礎——shell基礎——指令碼執行方式

所有的Linux命令都可以在shell中執行 1、echo 輸出命令 【[email protected] ~】#echo 【選項】【輸出內容】 選項:     -e   :支援反斜線控制的字元轉換 那什麼樣的字元加反斜線才能被識別呢?

Linux學習1shell中將指令碼檔案呼叫函式的輸出值輸出到檔案

一般a.sh等指令碼檔案可以很容易的將a.sh的echo等資料輸出到文字檔案,如: ./a.sh >1.txt 但是無法將指令碼檔案呼叫函式的輸出值輸出到檔案 可以使用%>: [email

學習筆記shell指令碼基礎

Shell----if&for 判斷檔案是否存在 [[email protected] ~]# vi 1.sh [[email protected] ~]# bash -x 1.sh + l=123/121 + '[' '!' -e

linux學習筆記shell程式設計

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記shell程式設計流程控制3---for迴圈

for迴圈 語法格式1:指定迴圈範圍 for 變數 in value1 value2... do something done 指令碼例項1 #!/bin/bash for i in 1 2

linux學習筆記shell程式設計流程控制4while迴圈和until迴圈

while迴圈和until迴圈 ###、 while迴圈 不定迴圈,程式碼格式: while [判斷] do something done 指令碼例項1: #!/bin/bash #從1加到

linux學習筆記shell程式設計

1.什麼是Shell?   Shell是一個命令列直譯器,它為使用者提供一個向linux核心傳送請求以便執行程式的介面系統級程式,使用者可以用Shell來啟動、掛起、停止甚至編寫一些程式。   Shell還是一個功能強大的程式語言,易編寫、已除錯、靈活性強。Shell是解釋執行的指令碼語

linux學習筆記shell程式設計條件判斷

條件判斷 檔案存在與否 -d 是否存在為目錄 -e 是否是檔案 -f 是否存在為檔案 [-d /root && echo "yes" || echo "no"] -檔案讀寫執行許可權#### -r 讀許可權 -w 寫

linux學習筆記shell程式設計正則表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

Linux學習基礎Shell程式設計——正則表示式

1、正則表示式與萬用字元 》正則表示式用來在檔案中匹配符合條件的字串,正則是包含匹配。grep、awk、sed等命令可以支援正則表示式。 》萬用字元用來匹配符合條件的檔名,萬用字元是完全匹配。ls、find、cp等這些命令不支援正則表示式,所以只能使用shell自己的萬用字元來進行匹配了

Linux學習基礎——Shell基礎-概述

1、Shell是什麼 shell是一個命令列直譯器,它為使用者提供了一個像Linux 核心傳送請求以便執行程式的介面系統級程式,使用者可以用shell來啟動、掛起、停止甚至是編寫一些程式。 shell還是一個功能相當強大的程式語言,易編寫,易除錯,靈活性較強。shell是解釋執行的指令碼

Linux運維shell指令碼基礎知識

1、bash中的算術運算   let運算子 [[email protected]:vg_adn_tidbCkhsTest~/tidb-bench/sysbench]#let i=1+2 [[email protected]:vg_adn_tidbCkhsTe

Linux學習7Shell基礎--Bash基本功能

一、歷史命令與命令補全   1.歷史命令--history     語法:history [選項] [歷史命令儲存檔案]     選項:-c  清空歷史命令        -w  把快取中的歷史命令寫入歷史命令儲存檔案(預設儲存檔案為各使用者家目錄下的.bash_history檔案)   歷史命令預

Linux學習8Shell編程--基礎正則表達式

inf 通配 shell編程 bubuko 自己 find shell com info 1. 正則表達式與通配符   正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配的。grep、awk、sed等命令可以支持正則表達式。   通配符是用來匹配符合條件的文件名,通

Linux學習8Shell編程--條件判斷

並且 cin mil tro shell編程 spa 判斷 ont shel 一、按照文件類型進行判斷 測試選項 作 用 -b 文件 判斷該文件是否存在,並且是否為塊設備文件(是塊設備文件為真) -c 文件 判斷該文件是否

Linux學習3shell的if大小比對使用

if的大小比對: #!/bin/sh a=10 b=20 if [ $a == $b ] then echo "a is equal to b" elif [ $a -gt $b ] t

Linux學習6shell篩選當前目錄下檔案並逐個對其進行操作

程式碼: hadoop@Master:~/cloud/adam/xubo/code$ cat a.sh #!/bin/bash #SRR003161h20t1 #samtools view -h -S SRR003161h20t1.sam >SRR003161h

Linux學習筆記Python3的安裝以及建立虛擬環境CentOS

body { background: #f4f4f4 } .title { width: 100%; background: #5cb85c; padding: 5px; font-size: 20px; margin: 5px } .sub_title { width: 99%; background: #