無奈之延時函式的誤差

2021-09-19 06:40:06 字數 1037 閱讀 1830

瀏覽器時鐘精度

瀏覽器的時鐘精度就是瀏覽器更新時鐘的頻率。更新的越頻繁,那麼時間也就越準確。

現在瀏覽器的最小精度為4ms,但並不意味著頻率時刻保持在4ms。仔細分析一下,「更新操作」對電腦來說是比較燒腦的,腦子稍微差點的cpu反應慢,精度就低。事實上,除了cpu硬體之外,作業系統(osx和windows下不同)以及瀏覽器核心都會影響到瀏覽器的精度;其次,電腦本身的調節機制,尤其是筆記本。筆記本在使用電池供電的時候,精度就會被自動降低從而達到保護電源的作用。所以最小精度4ms只是當今瀏覽器的最高水平,顯示情況下是不會達到這一精度。

延時函式的不準確性

在人類的眼中或許感覺不到settimeout()和setinterval()存在誤差,畢竟ms級的時間太短暫了。但事實上確實存在著誤差。下面來講誤差從何而來。

settimeout(fn,15ms);
我們先設定了這樣乙個延時處理的函式,fn函式被新增到佇列當中,預計15ms之後執行。

過去的瀏覽器時間精度在10ms~15.6ms之間已經是極限了,那麼我們就假設我們使用的瀏覽器的時間精度為10ms。

函式等待時間    |--------------| 15ms

瀏覽器重新整理 |--------||----------| 20ms

當第乙個10ms之後,瀏覽器重新整理了時間,發現「我靠,跑了這麼久,還沒有到點」,於是又發動第二次重新整理。第二次重新整理結束之後,20ms已經過去了,函式才到了執行期,並且比預期要多等了5ms。

我們知道,瀏覽器執行js和更新介面是共用乙個執行緒的,當執行緒空閒時,它會從任務佇列中取任務來執行。所以當函式到了執行期時,它會被新增到佇列當中,但是不一定立即執行,如果佇列中還有其他任務,單執行緒的規則就會導致這個函式需要等待前面的任務執行完才可以執行。

基於這兩點原因,settimeout()和setinteval()在微世界中,其實並不守時,這是無法控制且無奈的事情。

從上面可以看出,瀏覽器的精度越小,那麼誤差也就越小。嗯 ~ ~ 排隊時間無法預算,只能求老天保佑了。

uCOS II任務之延時函式

1.在ucos ii裡,系統也提供了這樣的延時函式。乙個是大眾版的ostimedly 乙個是精緻版的ostimedlyhmsm 蘿蔔青菜,各有所愛,隨你怎麼選。這兩者的區別是,ostimedly 的延時時間是以節拍數來衡量的,ostimedlyhmsm 的延時時間則是以具體時間大小來衡量的。這兩個函...

C 的延時函式

原博文鏈結在我的官方 是 在linux下,我們這樣使用 include include int main void return 0 我們使用 include標頭檔案裡面的sleep 函式,給這個函式傳入的形參是以秒為單位的正整數。上面的程式執行的效果應該是 以一秒為單位列印hello world ...

延時函式中的volatile

除錯wince驅動時候,有時候碰到us級別的時序要求的短延時,使用硬體定時器顯得麻煩.一般我會用乙個短延時delay 今天碰到了離奇事情.實現乙個短延時,用巨集,內聯函式或者函式都可以實現.下面是乙個例子.define delay us dowhile 0 你能想象的出上面 有什麼問題?我使用pb的...