Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在非焦点选项卡中运行时的Javascript性能_Javascript_Firefox_Google Chrome - Fatal编程技术网

在非焦点选项卡中运行时的Javascript性能

在非焦点选项卡中运行时的Javascript性能,javascript,firefox,google-chrome,Javascript,Firefox,Google Chrome,Chrome和Firefox*的最新版本似乎有所改变,现在Javascript的执行似乎有所不同,因为它运行的选项卡不是当前关注的选项卡 当我运行Javascript单元测试时,它们通常需要20秒才能完成,但现在,当选项卡未聚焦时,需要2000秒以上。但奇怪的是,每个单独测试的运行时间没有受到影响(大多数仍然

Chrome和Firefox*的最新版本似乎有所改变,现在Javascript的执行似乎有所不同,因为它运行的选项卡不是当前关注的选项卡

当我运行Javascript单元测试时,它们通常需要20秒才能完成,但现在,当选项卡未聚焦时,需要2000秒以上。但奇怪的是,每个单独测试的运行时间没有受到影响(大多数仍然<10ms)。我正在使用的测试运行程序在运行每个测试之间添加了一个
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)
    }
}