浅尝boost之timer
??????我一直是在努力推介boost,因為boost是一塊美玉,但,沒有什么是完美的。現在,我將暴露出boost的一點瑕疵:boost::timer。雖說是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子:
?boost::timer?t;
?Sleep(1000);
?cout?<<?t.elapsed()?<<?endl;
?
?//?redhat9?中gcc3.2.3編譯運行
?boost::timer?t;
?sleep(1);
?cout?<<?t.elapsed()?<<?endl;
?
???? 他們的結果是一樣嗎?不同的操作系統,時鐘精度是不一樣,結果自然不完全一樣;但我說的不一樣不是這一點小小的差異,而是在redhat9上t.elapsed()返回的竟然是 0 。boost::progress_timer也有同樣問題,為什么 ?
?
???? boost::timer是一個clock()的非常簡單的封裝,簡單到我不認為有理由存在于boost之樣的庫之中。基本只是下面的東西
?{
??public:
??????????timer()??{?_start_time?=?clock();?}?
???void???restart()??{?_start_time?=?clock();?}?
???double?elapsed()?const{?return??double(clock()?-?_start_time)?/?CLOCKS_PER_SEC;?}
??private:
????clock_t?_start_time;
?};?//?timer
?
???? 所以拋開boost::timer這層包裝來看,就是clock與sleep之間的問題了。為什么不用sleep就可以得到流逝的時間呢(cin.get()也不能得到)。推其原因在于linux平臺上sleep時,clock是獲得CPU被使用的時間。而這時進程會等待一個signal,這一段時間CPU不會被使用,clcok()認為時間沒有流逝所致。而windows平臺卻是認為Sleep時也是有時間流逝的,而不是看CPU有沒有被使用,我也是這么考慮的 :-)。這樣一來兩者之間就有了極大的不同。
?
???? 所以,想要一個正確的跨平臺的timer就得自己動些手了。
???? 一種方案是修改sleep,但問題是要保證調用者準確的調用了這個函數,另外,這個方法使用了輪詢,感覺不好。一般sleep的調用者都會希望這時候程序不占用CPU資源。
?void sleep( clock_t wait )
?{
??? clock_t goal;
??? wait = (clock_t) wait * CLOCKS_PER_SEC;
??? goal = wait + clock();
??? while( goal > clock());
?}
?
???? 另一種方案是自己取當前時間,取代clock(),至于用什么函數則看自己的要求了。發現在這個問題是在一個ACE程序中,我就用ACE封裝的函數包裝了一個,不同平臺的sleep也可用ACE_OS::sleep代替
?
?{
?public:
??Elapsed()
??{
???restart();
??}
??void?restart()
??{
???_tv?=?ACE_OS::gettimeofday();
??}
??//?返回以秒為單位的流逝時間
??long?elapsed()
??{
???ACE_Time_Value?now?=?ACE_OS::gettimeofday();
???return?now.sec()?-?_tv.sec();
??}
??
??ACE_Time_Value?ACE_elapsed()
??{
???return?(ACE_OS::gettimeofday()?-?_tv);
??}
??
?private:
??ACE_Time_Value?_tv;
?};
??
???? 如果沒有用ACE,完成一個這樣的封裝也是很簡單的,因為,這個功能實在簡單:-)
轉載于:https://www.cnblogs.com/lzjsky/archive/2011/01/13/1934808.html
總結
以上是生活随笔為你收集整理的浅尝boost之timer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vc++创建异性窗体(2)
- 下一篇: 进一步了解 apt-get 的几个命令