在非焦点选项卡中运行时的Javascript性能
Chrome和Firefox*的最新版本似乎有所改变,现在Javascript的执行似乎有所不同,因为它运行的选项卡不是当前关注的选项卡 当我运行Javascript单元测试时,它们通常需要20秒才能完成,但现在,当选项卡未聚焦时,需要2000秒以上。但奇怪的是,每个单独测试的运行时间没有受到影响(大多数仍然<10ms)。我正在使用的测试运行程序在运行每个测试之间添加了一个在非焦点选项卡中运行时的Javascript性能,javascript,firefox,google-chrome,Javascript,Firefox,Google Chrome,Chrome和Firefox*的最新版本似乎有所改变,现在Javascript的执行似乎有所不同,因为它运行的选项卡不是当前关注的选项卡 当我运行Javascript单元测试时,它们通常需要20秒才能完成,但现在,当选项卡未聚焦时,需要2000秒以上。但奇怪的是,每个单独测试的运行时间没有受到影响(大多数仍然
setTimeout(0)
,这样浏览器在执行时就不会锁定,这似乎是罪魁祸首
有没有办法告诉Javascript引擎不要“取消”该选项卡的优先级?能够在后台运行我的测试,而不必看我自己,这真是太好了
*很抱歉,我不太关心如何安装旧版本来查找何时开始发生这种情况。至少,现在Firefox 5.0和Chrome 12上都出现了这种情况。
setTimeout
和setInterval
在未聚焦的选项卡中被限制为至少1000毫秒。是提到它的Bugzilla报告。这里是相似的。我相信Firefox5和Chrome自11版以来就是如此
根据:
在(Firefox 5.0/Thunderbird 5.0)和
Chrome 11,超时被夹紧到
每小时射击不超过一次
第二个(1000ms)在非活动选项卡中;看见
bug 633421了解有关的更多信息
这在Mozilla或crbug.com/66078中可以找到
在Chrome中详细介绍了这一点
至于绕过此限制,您可以尝试中讨论的技术,但我还没有更改自己尝试它。所做的更改是增加(大量)最小超时值。据我所知,这是无法控制的;它位于计时器实现的内部。Chrome和Firefox现在都可以这样做,也许Safari也可以
如果使用“setInterval()”,它会变得非常奇怪,因为浏览器似乎希望确保间隔回调调用的次数正确。当您返回页面时,随着间隔计时器的追赶,您会看到一系列的活动。特别是对于Firefox,您可以将
about:config
中的dom.min\u background\u timeout\u值更改为用于运行测试的配置文件中您喜欢的值。不过,我不建议您在默认的浏览配置文件中这样做:之所以使用高钳位,是因为它可以减少后台选项卡中的网站占用CPU更新愚蠢的代码等等。我可以使用multiple setInterval()解决此问题:
var setRealInterval=函数(回调,间隔){
var minBrowserInterval=1000
var setIntervalsCount=Math.max(1,minBrowserInterval/interval)
对于(变量i=0;i
和:要在现代浏览器中实现0毫秒超时,您可以使用window.postMessage()
@James-您发表了您的评论,就在我用该页面引用的文章更新我的答案时:)
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)
}
}