日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅尝boost之timer

發布時間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅尝boost之timer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


??????我一直是在努力推介boost,因為boost是一塊美玉,但,沒有什么是完美的。現在,我將暴露出boost的一點瑕疵:boost::timer。雖說是瑕不掩瑜,但瑕疵就是瑕疵。先看一看下面的例子:

?//?win2000?中vc7.1編譯運行
?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之樣的庫之中。基本只是下面的東西

?class?timer
?
{
??
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代替
?

?class?Elapsed
?
{
?
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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。