2011-07-05 20 views
9

似乎Chrome和Firefox *的某些最新版本已經發生變化,現在Javascript運行似乎與當前運行的選項卡不同一。在未聚焦的選項卡中運行時的Javascript性能

當我運行我的Javascript單元測試時,他們通常需要大約20秒才能完成,但現在,當標籤未聚焦時,需要2000秒以上的時間。但奇怪的是,每個單獨測試的運行時間不受影響(大多數仍然是< 10ms)。我正在使用的測試運行器在運行每個測試之間添加了一個setTimeout(0),以便瀏覽器在執行時不會鎖定,所以這似乎是可能的罪魁禍首。

有沒有辦法告訴Javascript引擎不要「deprioritise」該標籤,但?很高興能夠在後臺運行我的測試,而無需看我自己...

* 對不起,我不太在意嘗試安裝舊版本以查找何時開始發生。至少現在發生在Firefox 5.0和Chrome 12上。

回答

9

setTimeoutsetInterval在未聚焦的選項卡中被限制爲最少1000毫秒。提及它的Bugzilla報告是Here。這裏是類似Chromium bug report。我相信這是因爲版本11

在Firefox 5和Chrome的情況下,根據MDN

在(火狐5.0/5.0雷鳥)和 鉻11,超時將被鎖定到 沒有開火在非活動選項卡上每 秒(1000毫秒)更頻繁地發生;有關 this在Mozilla中的更多信息,請參閱 錯誤633421;有關Chrome的詳細信息,請參閱crbug.com/66078中的 。

至於繞過這個限制,你可以嘗試在this article中討論的技術,但是我還沒有改變過自己嘗試。

+0

和:要實現0毫秒在現代瀏覽器超時您可以用'window.postMessage()'的https://developer.mozilla。組織/ EN/DOM /窗口。setTimeout – James

+0

@James - 你發表了你的評論,就像我更新了我的答案和該頁面提到的那篇文章:) –

+0

偉大的思想家都認爲......並且有相同的名字! :) – James

2

所做的更改是增加(大量)最小超時值。據我所知,沒有辦法控制它;它在定時器實現的內部。 Chrome和Firefox現在都這樣做,也許也是Safari。

如果使用「setInterval()」,它會變得很奇怪,因爲它似乎瀏覽器想要確保間隔回調被調用正確的次數。當您返回頁面時,您會在間隔計時器中收到一連串的活動。

5

對於Firefox,特別是,您可以將about:config中的dom.min_background_timeout_value首選項更改爲您在用於運行測試的配置文件中的一些喜好。但我不會建議你在默認的瀏覽配置文件中這樣做:高鉗位的原因是它減少了在後臺標籤中咀嚼CPU更新愚蠢行爲等的網站。

0

我可以使用多個的setInterval()解決方法是:

var setRealInterval = function(callback, interval) { 
    var minBrowserInterval = 1000 
    var setIntervalsCount = Math.max(1, minBrowserInterval/interval) 
    for (var i = 0; i < setIntervalsCount; i++) { 
     ;(function(i) { 
      setTimeout(function() { 
       setInterval(callback, interval * setIntervalsCount) 
      }, i * interval) 
     })(i) 
    } 
} 
相關問題