【问题标题】:Javascript performance when running in an unfocused tab在非焦点选项卡中运行时的 Javascript 性能
【发布时间】:2011-07-05 15:25:03
【问题描述】:

Chrome 和 Firefox* 的某些最新版本似乎发生了变化,现在,当正在运行的选项卡不是当前关注的选项卡时,Javascript 的执行似乎有所不同。

当我运行我的 Javascript 单元测试时,它们通常需要大约 20 秒才能完成,但现在,当标签没有聚焦时,它需要超过 2000 秒。不过奇怪的是,每个单独测试的运行时间都没有受到影响(大多数仍然小于 10 毫秒)。我正在使用的测试运行程序在运行每个测试之间添加了一个setTimeout(0),这样浏览器就不会在执行时锁定,这似乎是罪魁祸首。

有没有办法告诉 Javascript 引擎不要“取消优先级”该选项卡?能够在后台运行我的测试而不必看着自己真是太好了......

*抱歉,我不太在意尝试安装旧版本来查找何时开始发生这种情况。至少,它现在正在 Firefox 5.0 和 Chrome 12 上发生。

【问题讨论】:

    标签: javascript firefox google-chrome


    【解决方案1】:

    setTimeoutsetInterval 在非焦点选项卡中已被限制为至少 1000 毫秒。 Here 是提到它的 Bugzilla 报告。这是类似的Chromium bug report。我相信 Firefox 5 和 Chrome 自 11 版以来就是这种情况。

    根据MDN

    在 (Firefox 5.0 / Thunderbird 5.0) 和 Chrome 11,超时被限制为 每次射击不超过一次 非活动标签中的第二个(1000 毫秒);看 错误 633421 了解更多信息 这在 Mozilla 或 crbug.com/66078 中 Chrome 中的详细信息。

    至于绕过这个限制,你可以尝试this article中讨论的技术,但我还没有改变自己尝试。

    【讨论】:

    • 并且:要在现代浏览器中实现 0 毫秒超时,您可以使用 window.postMessage() developer.mozilla.org/en/DOM/window.setTimeout
    • @James - 当我用该页面引用的文章更新我的答案时,您发表了您的评论 :)
    【解决方案2】:

    特别是对于 Firefox,您可以将 about:config 中的 dom.min_background_timeout_value 首选项更改为您在用于运行测试的配置文件中喜欢的数量。不过,我不建议在您的默认浏览配置文件中这样做:高钳位的原因是它减少了后台选项卡中的网站消耗 CPU 更新愚蠢的代码等。

    【讨论】:

      【解决方案3】:

      所做的更改是增加(很多)最小超时值。据我所知,没有办法控制它。它在计时器实现的内部。现在 Chrome 和 Firefox 都可以这样做,也许 Safari 也可以。

      如果你使用“setInterval()”会变得很奇怪,因为浏览器似乎想要确保间隔回调被调用正确的次数。当您返回该页面时,您会在间隔计时器赶上时获得一阵活动。

      【讨论】:

        【解决方案4】:

        我可以使用多个 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)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-05-09
          • 1970-01-01
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多