瀏覽器的時鐘精度
瀏覽器的時鐘精度
Nicholas C. Zakas發表於2011年12月14日上午7:00
標籤:JavaScript,效能,時鐘
時鐘精度是指時鐘更新的頻率,大部分情況下,網路瀏覽器使用諸如setTimeout() 和setInterval()的函式呼叫系統預設時鐘,這意味著瀏覽器部署程式碼時只能和系統時鐘同步。Internet Explorer的日期物件(Date Object)也把系統時鐘作為種子值,因此日期物件的差異也就只能用時鐘精度來衡量。
歷史簡介
Windows機器預設時鐘精度為10-15.6毫秒(大部分情況是15.6毫秒),亦即瀏覽器採用的系統時鐘遵循該時鐘精度。當然,以目前CPU處理器速度而言,10-15.6毫秒是一個極限。IE瀏覽器到IE 8都還獨佔系統時鐘,以至於John Resig撰文闡釋時間精度如何影響基準程式1也就不足為奇了。但是,OS X下瀏覽器時鐘較Windows下更為精確。
直到最近,Window下其他瀏覽器也使用系統時鐘,遵循15.6毫秒的時鐘精度,這在Firefox、Safari和Opera均得到體現。Chrome應該是首個採用高精度時鐘的Windows瀏覽器2,他們的實驗有一些有趣的結論。
他們最初的想法是讓Chrome使用亞毫秒級精度的時鐘,但後來放棄了,並換用1毫秒精度。他們決定採用Windows多媒體時鐘API,這能夠給定達到1毫秒精度的時鐘並用以此替代系統時鐘。這和Flash和Quicktime等外掛使用的時鐘相同。
Chrome 1.0 beta版採用了1毫秒的時鐘精度。這看起來不錯,但執行時卻收到許多bug報告。1毫秒精度的時鐘導致CPU高速運轉,當CPU運轉時,因不能進入睡眠模式(低耗電)而耗電增加3。這使得Chrome將時鐘精度延長到4毫秒。
這4毫秒的延遲在HTML5中作為時鐘部分被記錄下來4,HTML5認為setTimeout()的最小精度應為4毫秒。而setInterval ()的最小精度被設定為10毫秒。
目前的時鐘精度
和Chrome一樣,IE9、Firefox 5、Safari 5.1和 Opera 11也都跟著採用了4毫秒的時鐘精度。此前,Firefox 4和Safari 5及它們的早期版本採用的是10毫秒的時鐘精度(顯然,這是在WebKit核心固定的)。iOS 5上Safari移動瀏覽器也採用4毫秒精度,Kindle Fire上的Silk採用10毫秒精度,這暗示了它可能是在老版本的WebKit平臺上開發的。然而,正因為目前瀏覽器普遍採用4毫秒精度,並不意味著那就是你能獲得的精度。
大部分瀏覽器基於不同情況都會採取一些調節措施(使得時鐘精度延遲),目的在於在合適時候保護電池——理論上講,這些時間使用者既不會察覺出異樣也願意為延長筆記本或移動裝置電池壽命(做些讓步)。下面這些情況時鐘精度會做相應調整:
- 當筆記本使用電池電源時,Chrome 和 IE 9+自動回撥到系統時鐘,而換上交流電源時又調整到4毫秒精度。
- Firefox 5+、 Chrome 11+和IE 10+對未啟用的tab頁面使用1000毫秒的時鐘精度5。
- 使用其他應用程式時,iOS5上的Safari移動瀏覽器和Kindle Fire上的Silk完全凍結時鐘,直至再次使用瀏覽器時才解凍。
瀏覽器往往不斷調節適應時鐘精度以適應電池供電裝置的耗電。HTML5特地為瀏覽器開發人員預留了完成該調整的空間。
結論
隨著瀏覽器近年來的發展,時鐘精度一直在悄悄的改進。時鐘精度並非經常討論的熱門話題,但當使用setTimeout() 和 setInterval()時,需要對其功能加以深入理解。我們越來越接近對瀏覽器的每毫秒的監控了,一旦有人解決了高精度時鐘執行時的CPU崩潰問題,我們將很可能看到時鐘精度的再次提高。但在這之前,記住4毫秒的限值,且牢記我們往往達不到這種狀態。
2011年12月15日更新:更新了關於日期物件的相關資訊。
參考文獻
Accuracy of JavaScript Time by John Resig
JavaScript時間精度 John Resig
Chrome: Cranking up the clock by Mike Belshe
Chrome:啟動時鐘管理 Mike Belshe
CPU Power Utilization on Intel® Architectures by Karthik Krishnan
Intel®架構下的CPU電力使用 Karthik Krishnan
Timers in HTML5
HTML5下的時間設定
Clamp setTimeout/setInterval to something higher than 10ms in inactive tabs
對未啟用標籤頁(tabs)中高於10毫秒精度物件強制設定時鐘(setTimeout/setInterval)
Timer Resolution Test by Ryan Grove
時鐘精度測試 Ryan Grove
宣告:本文所有觀點和意見來自Nicholas C. Zakas,無論如何,請勿關聯我的僱主、同事、Wrox出版社、O'Reilly出版社或者其它任何人。我僅表達自己的觀點,而非為他人。
原文標題:Timer resolution in browsers
原文地址:http://www.nczonline.net/blog/2011/12/14/timer-resolution-in-browsers
相關文章
- 跟隨滑鼠走的時鐘[跨瀏覽器支援]瀏覽器
- Linux時鐘精度Linux
- 瀏覽器的session何時消失?瀏覽器Session
- 使用Selenium時的瀏覽器設定瀏覽器
- 【瀏覽器】瀏覽器基本工作原理瀏覽器
- 高精度計時器
- 淺談瀏覽器實時構建瀏覽器
- 谷歌瀏覽器定時重新整理谷歌瀏覽器
- 瀏覽器瀏覽器
- Chrome 瀏覽器修改 UA 模擬其它瀏覽器,包括移動瀏覽器Chrome瀏覽器
- 【乾貨】十分鐘讀懂瀏覽器渲染流程瀏覽器
- 基石-初見瀏覽器(一):瀏覽器渲染瀏覽器
- Min瀏覽器: 更快更輕量瀏覽器瀏覽器
- .net火狐瀏覽器 ie瀏覽器 判斷瀏覽器
- Edge瀏覽器被搜狗瀏覽器篡改的解決方法瀏覽器
- microsoft edge是ie瀏覽器嗎 edge瀏覽器和ie瀏覽器一樣嗎ROS瀏覽器
- 前端面試瀏覽器系列:瀏覽器快取前端面試瀏覽器快取
- Edge瀏覽器的前世今生 史上最全Edge瀏覽器介紹瀏覽器
- 瀏覽器的 Event Loop瀏覽器OOP
- 瀏覽器的安全管理瀏覽器
- 瀏覽器眼中的0瀏覽器
- 瀏覽器的同源策略瀏覽器
- 5分鐘上手瀏覽器外掛測試——Eolink Apikit瀏覽器API
- “木偶”瀏覽器瀏覽器
- 瀏覽器原理瀏覽器
- 瀏覽器核心瀏覽器
- vivaldi瀏覽器瀏覽器
- Mozilla瀏覽器瀏覽器
- 瀏覽器引擎瀏覽器
- 瀏覽器渲染瀏覽器
- [瀏覽器]LocalStorage瀏覽器
- js檢測搜狗瀏覽器、百度瀏覽器、微信瀏覽器程式碼例項JS瀏覽器
- 你們要的日文AI實時字幕來了,谷歌瀏覽器VS小白瀏覽器AI大比拼AI谷歌瀏覽器
- 重學瀏覽器(1)-多程式多執行緒的瀏覽器瀏覽器執行緒
- 怎麼檢測瀏覽器劫持,瀏覽器劫持的方法介紹瀏覽器
- 超好用的mac瀏覽器:星願瀏覽器 Mac中文版Mac瀏覽器
- 判斷當前瀏覽器是不是微信瀏覽器瀏覽器
- 修改錄製指令碼時使用的預設瀏覽器指令碼瀏覽器