瀏覽器的時鐘精度

alan911發表於2012-05-24

瀏覽器的時鐘精度

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日更新:更新了關於日期物件的相關資訊。

參考文獻

  1. Accuracy of JavaScript Time by John Resig

    JavaScript時間精度 John Resig

  2. Chrome: Cranking up the clock by Mike Belshe

    Chrome:啟動時鐘管理 Mike Belshe

  3. CPU Power Utilization on Intel® Architectures by Karthik Krishnan

    Intel®架構下的CPU電力使用 Karthik Krishnan

  4. Timers in HTML5

    HTML5下的時間設定

  5. Clamp setTimeout/setInterval to something higher than 10ms in inactive tabs

    對未啟用標籤頁(tabs)中高於10毫秒精度物件強制設定時鐘(setTimeout/setInterval)

  6. 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

相關文章