|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!Linuxshell猎取工夫和工夫距离(ms级别)
申明:在举行一些功能测试的时分,偶然候我们但愿能盘算一个步伐运转的工夫,偶然候大概会本人写一个shell剧本便利举行一些功能测试的把持(好比但愿能运转N次取均匀值等),总之,这个中有一个需求大概就是猎取一个工夫戳或工夫差。
1.Linuxshell猎取工夫的相干下令
time下令:猎取一个步伐的实行工夫,能够猎取到实践运转工夫和步伐在用户态和内核态分离的工夫,年夜局部的功能测试,大概只必要存眷实践工夫。
time下令的利用就很复杂了,在原本的要运转的步伐(可实行文件、剧本等任何可实行步伐)之前加上time便可。
成绩一:time下令的经常使用选项
利用time,经常使用的选项是:-f和-p。个中-f前面指定一个格局串,把持time的输入的格局,默许的time输入是real、user、sys三行以xm***.***s的格局输入,经由过程-f能够把持。
-p选项也是格局,暗示利用posix尺度的格局,次要的区分是显现的工夫都是以s为单元的,详细关于格局的成绩参考mantime的匡助内容就晓得了。
PS:-f选项没法事情?弄不分明为什么-f和-o等选项都没法事情,晓得的请增补。(-p是事情的)
另外一种把持格局的***是设置TIMEFORMAT情况变量,详细参考mantime能够晓得这些格局把持符分离暗示甚么。举比方下:
[plain]viewplaincopyprint?
- #timepwd/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#exportTIMEFORMAT="realtime%E,usertime%U,systime%S"#timepwd/home/sgeng2realtime0.000,usertime0.000,systime0.000#time-ppwd/home/sgeng2real0.00user0.00sys0.00#
复制代码
- #timepwd/home/sgeng2real 0m0.000suser 0m0.000ssys 0m0.000s#exportTIMEFORMAT="realtime%E,usertime%U,systime%S"#timepwd/home/sgeng2realtime0.000,usertime0.000,systime0.000#time-ppwd/home/sgeng2real0.00user0.00sys0.00#
复制代码 PS:很奇异,感到time的有些格局和下面的选项一样,仿佛不完整事情,总之,干系不年夜,格局其实不主要,一样平常利用-p以秒作为单元就充足了。
成绩二:time下令的输入的成绩
下面已说到,仿佛-o选项其实不事情,那末,我们就只能本人想举措了。偶然候写剧本,就但愿把time的了局输入到文件中,然后大概会依据time的输入举行一些处置,好比提掏出real工夫等。明显,人人能想到的是重定向了,至于重定向的利用这里明显禁绝备会商(太庞大),只是提醒一点:time下令的输入了局是输入到stderr的,不是stdout,以是举行重定向的时分要注重了。看懂上面的例子基础就可以了解了:
[plain]viewplaincopyprint?
- #timepwd/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#timepwd>out.txtreal0m0.000suser0m0.000ssys0m0.000s#catout.txt/home/sgeng2#timepwd2>out.txt/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#catout.txt#(timepwd)2>out.txt/home/sgeng2#catout.txtreal0m0.000suser0m0.000ssys0m0.000s#(timepwd)>&out.txt#catout.txt/home/sgeng2real0m0.000suser0m0.000ssys0m0.000s#
复制代码
- #timepwd/home/sgeng2real 0m0.000suser 0m0.000ssys 0m0.000s#timepwd>out.txtreal 0m0.000suser 0m0.000ssys 0m0.000s#catout.txt/home/sgeng2#timepwd2>out.txt/home/sgeng2real 0m0.000suser 0m0.000ssys 0m0.000s#catout.txt#(timepwd)2>out.txt/home/sgeng2#catout.txtreal 0m0.000suser 0m0.000ssys 0m0.000s#(timepwd)>&out.txt#catout.txt/home/sgeng2real 0m0.000suser 0m0.000ssys 0m0.000s#
复制代码 PS:这里更多的是触及到的和重定向相干的内容,以是不会具体剖析每个例子。申明的是注重timepwd2>out.txt和(timepwd)2>out.txt的区分,后面一个的寄义是把pwd的了局stderr重定向到out.txt,相称于"time(pwd2>out.txt)"的了局。
date下令:
关于date下令的利用,百度一把一年夜堆,就不反复了,比方能够参考:http://xingfujie.blog.51cto.com/2791569/637223
这里只申明一下几个罕见的成绩:
成绩一:date的%s和%N
date中有良多把持格局的,个中%s是猎取以后工夫间隔1970-01-0100:00:00UTC的工夫差。date的别的良多格局把持都是把持以后工夫的输入格局罢了,好比只输入时分秒,只输入年代日等等,个中%N也是这一类,%N输入的是以后工夫的纳秒局部,因为date并没有毫秒品级其余输入,以是在秒以下的内容都属于纳秒局部。以是从这个角度说,date是能够很准确的,能够到达纳秒级别。
成绩二:猎取一个工夫戳
偶然候会利用工夫戳,大概随机数,UUID如许的器材,百度一下也有相干文章(好比搜刮”shelldate随机数“等)。一样平常来讲,能够用%s和%N组合的体例就没成绩,统一秒内,两次运转%N一定不会一样,以是%s和%N组合能失掉一个独一数。
[plain]viewplaincopyprint?
- #date+%s.%N1337435374.969263560#date+%s+%N1337435377+310281496#date+%s_%N1337435381_209334510#date+%s_%N1337435383_169263078#date+%s_%N1337435383_830009679#
复制代码 PS:偶然候大概但愿用一个”独一“的器材来对文件定名等,就能够加上工夫戳了。
2.Linuxshell猎取工夫差(利用date下令)
至于利用time下令,其自己就是猎取一个工夫差,可是明显,time只合用于一些复杂的情形,由于前面的参数是能够实行的内容,偶然候大概必要实行多条下令,用time就对照贫苦。
(1)秒为单元
date猎取的是”以后工夫“,明显,两次运转date就能够失掉一个工夫差,实际上,可使用良多格局来暗示date的输入,从而盘算工夫差,可是,明显,最间接的体例就是利用%s了,如许间接就能够盘算出一个工夫差,不必要那末庞大的shell字符串处置了。以下:
[plain]viewplaincopyprint?
- #start=$(date+%s)&&sleep2&&end=$(date+%s)&&echo$(($end-$start))
- 2
- #start=$(date+%s)&&sleep3&&end=$(date+%s)&&echo$(($end-$start))
- 3
- #
- #start=$(date+%s)&&sleep2&&end=$(date+%s)&&echo$(($end-$start))2#start=$(date+%s)&&sleep3&&end=$(date+%s)&&echo$(($end-$start))3#
复制代码 固然,这里是在terminal中测试的,以是用&&一连实行这些下令,关于剧本,一行一行的写就很好了。。。。
[plain]viewplaincopyprint?
- start=$(date+%s)
- ...whattodofortiming...
- end=$(date+%s)
- time=$(($end-$start))
- echo$time
- start=$(date+%s)...whattodofortiming...end=$(date+%s)time=$(($end-$start))echo$time
复制代码
(2)ms为单元
更多的功能测试等场所猎取工夫差,有大概但愿准确到ms。现实上,利用date是能够到达ms的。间接上代码吧。
[plain]viewplaincopyprint?
- #!/bin/bash
- #filename:test.sh
- #arg1=start,arg2=end,format:%s.%N
- functiongetTiming(){
- start=$1
- end=$2
- start_s=$(echo$start|cut-d.-f1)
- start_ns=$(echo$start|cut-d.-f2)
- end_s=$(echo$end|cut-d.-f1)
- end_ns=$(echo$end|cut-d.-f2)
- #fordebug..
- #echo$start
- #echo$end
- time=$(((10#$end_s-10#$start_s)*1000+(10#$end_ns/1000000-10#$start_ns/1000000)))
- echo"$timems"
- }
- echo"Thisisonlyatesttogetamsleveltimeduration..."
- start=$(date+%s.%N)
- ls>&/dev/null#hey,bequite,donotoutputtoconsole....
- end=$(date+%s.%N)
- getTiming$start$end
- #!/bin/bash#filename:test.sh#arg1=start,arg2=end,format:%s.%NfunctiongetTiming(){start=$1end=$2start_s=$(echo$start|cut-d.-f1)start_ns=$(echo$start|cut-d.-f2)end_s=$(echo$end|cut-d.-f1)end_ns=$(echo$end|cut-d.-f2)#fordebug..#echo$start#echo$endtime=$(((10#$end_s-10#$start_s)*1000+(10#$end_ns/1000000-10#$start_ns/1000000)))echo"$timems"}echo"Thisisonlyatesttogetamsleveltimeduration..."start=$(date+%s.%N)ls>&/dev/null#hey,bequite,donotoutputtoconsole....end=$(date+%s.%N)getTiming$start$end
复制代码 PS:这个代码是一个复杂的测试,能够猎取到ls下令实行的工夫,信任其实行工夫已够短了,假如你必要猎取的工夫差在ms以下,信任你不会利用shell了,嘿嘿,天然要靠C往弄了。
了局以下:
[html]viewplaincopyprint?
- #./test.sh
- Thisisonlyatesttogetamsleveltimeduration...
- 3ms
- #./test.sh
- Thisisonlyatesttogetamsleveltimeduration...
- 2ms
- #./test.sh
- Thisisonlyatesttogetamsleveltimeduration...
- 2ms
- #
- #./test.shThisisonlyatesttogetamsleveltimeduration...3ms#./test.shThisisonlyatesttogetamsleveltimeduration...2ms#./test.shThisisonlyatesttogetamsleveltimeduration...2ms#
复制代码
还中意吧,能猎取到这么短的工夫。固然,实际上能够猎取到以ns为单元的工夫差,可是,团体以为用shell往弄这么小的工夫差,你以为正确么。。。
申明:
下面的代码的思绪,实在很复杂了,%s为间隔尺度工夫的秒数,%N为以后工夫的秒以下的局部,那末明显,%s和%N就暗示了以后工夫的完全工夫戳,两个工夫戳就差值就是工夫差,成绩就是怎样处置的成绩,也许就是:先利用%s.%N的格局猎取到start和end工夫,然后使用cut下令从start和end中猎取到“.“后面的秒的局部和前面的纳秒的局部(申明:这里的在%s和%N之间拔出点,只是作为分开的感化,任何大概的字符都是能够的,只需能被cut分隔就行);然后,用秒的局部相减,失掉秒的差值,转换为毫秒的差值;然后,把纳秒的局部转换为毫秒以后求差值(大概为正数);最初,两个差值相加就是真实的以毫秒为单元的差值了。很简单了解,关头是cut的利用,关于shell妙手来讲,应当有良多***能够对字符串提取,可是关于我如许的非shell妙手,要本人用awk或sed甚么的写一个提取的正则,仍是很有难度,还好找到了cut下令,能很简单的对这类字符串举行提取。以是:这里的***仅供参考。。。
关于代码中的“10#”,这是暗示前面的数是10进制的数字,之以是必要这个是由于这里的纳秒的后面是以0开首的,shell中仿佛以0开首会默许以为是八进制,招致运转报错,总之,百度一下就找到了缘故原由,这里就干脆把一切的数字都加上了10#,暗示都是10进制。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们! |
|