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學習2之shell指令碼計算程式碼段執行的時間(精確到毫秒)
簡潔且成功的程式碼: [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學習1之shell中將指令碼檔案呼叫函式的輸出值輸出到檔案
一般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程式設計(三)流程控制(4)while迴圈和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學習7之Shell基礎--Bash基本功能
一、歷史命令與命令補全 1.歷史命令--history 語法:history [選項] [歷史命令儲存檔案] 選項:-c 清空歷史命令 -w 把快取中的歷史命令寫入歷史命令儲存檔案(預設儲存檔案為各使用者家目錄下的.bash_history檔案) 歷史命令預
Linux學習8之Shell編程--基礎正則表達式
inf 通配 shell編程 bubuko 自己 find shell com info 1. 正則表達式與通配符 正則表達式用來在文件中匹配符合條件的字符串,正則是包含匹配的。grep、awk、sed等命令可以支持正則表達式。 通配符是用來匹配符合條件的文件名,通
Linux學習8之Shell編程--條件判斷
並且 cin mil tro shell編程 spa 判斷 ont shel 一、按照文件類型進行判斷 測試選項 作 用 -b 文件 判斷該文件是否存在,並且是否為塊設備文件(是塊設備文件為真) -c 文件 判斷該文件是否
Linux學習3之shell的if大小比對使用
if的大小比對: #!/bin/sh a=10 b=20 if [ $a == $b ] then echo "a is equal to b" elif [ $a -gt $b ] t
Linux學習6之shell篩選當前目錄下檔案並逐個對其進行操作
程式碼: 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: #