Chrome:在后台标签中暂停超时/间隔?

Koo*_*Inc 117 javascript tabs google-chrome settimeout

我正在测试setTimeout使用测试的准确性.现在我注意到(正如预期的那样)setTimeout并不是非常准确,但对于大多数设备并不是非常不准确.现在,如果我在Chrome中运行测试并让它在后台标签中运行(那么,切换到另一个标签并在那里浏览),返回测试并检查结果(如果测试完成),它们会发生显着变化.看起来超时运行速度慢得多.在FF4或IE9中测试没有发生这种情况.

因此,看起来Chrome暂停或至少减慢了无法关注的标签中的javascript执行速度.关于这个问题在网上找不到多少.这意味着我们无法运行后台任务,例如使用XHR调用定期检查服务器,并且setInterval(我怀疑看到相同的行为setInterval,如果有时间,我会编写测试).

有没有遇到过这个?这种暂停/减速会有解决方法吗?你会把它称为一个错误,我应该这样提交吗?

pim*_*vdb 79

我最近问过这个问题,这是设计上的行为.当选项卡处于非活动状态时,每秒最多只调用一次该函数.这是代码更改.

也许这会有所帮助: 当Chrome中的标签处于非活动状态时,如何使setInterval也能正常工作?

TL; DR:使用Web Workers.

  • 谢谢,我应该看看'非活动标签'.不是母语为英语的人有时会有障碍. (2认同)

Rus*_*hov 21

有一个使用Web Workers的解决方案,因为它们在单独的进程中运行并且不会减慢速度

我编写了一个可以在不更改代码的情况下使用的小脚本 - 它只是覆盖函数setTimeout,clearTimeout,setInterval,clearInterval

只需在所有代码之前包含它

http://github.com/turuslan/HackTimer

  • 这很好,但除此之外要注意:1.工人无法访问DOM,2.工人只有在他们自己的文件上才会执行.在很多情况下,它不是**setTimeout的直接替代品. (5认同)
  • 你是对的,但一些现代浏览器允许通过使用 Blob 来使用没有自己文件的工人 (http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers) (2认同)
  • 即使如此,Web Workers 仍然缺少许多功能(即 DOM),而这些功能使它们能够安全地替代 setTimeout 等。 (2认同)

Kaa*_*ral 6

播放〜空的声音会强制浏览器保持性能-阅读以下注释后,我发现了它:即使选项卡未激活,如何使JavaScript在Chrome中以正常速度运行?

对于使用WebSockets的浏览器游戏,我需要按需提供无限的性能,因此我从经验中知道使用WebSockets不能确保无限的性能,但是从测试来看,播放音频文件似乎可以确保它的性能。

这是我为此目的创建的2个空音频循环,您可以在商业上免费使用它们:http : //adventure.land/sounds/loops/empty_loop_for_js_performance.ogg http://adventure.land/sounds/loops/empty_loop_for_js_performance.wav

(它们包括-58db噪声,-60db不起作用)

我根据需要使用Howler.js播放它们:https : //github.com/goldfire/howler.js

function performance_trick()
{
    if(sounds.empty) return sounds.empty.play();
    sounds.empty = new Howl({
        src: ['/sounds/loops/empty_loop_for_js_performance.ogg','/sounds/loops/empty_loop_for_js_performance.wav'],
        volume:0.5,
        autoplay: true, loop: true,
    });
}
Run Code Online (Sandbox Code Playgroud)

令人遗憾的是,没有内置方法默认情况下可以打开/关闭完整的javascript性能,但是,加密矿工可以使用Web Workers劫持所有计算线程,而无需任何提示:|

  • 有趣的方法。这会劫持我的蓝牙耳机,并且不允许我的手机播放声音……事实上……这可能可以解释一些事情…… (2认同)

Mix*_*OID 6

对于单元测试,您可以使用参数运行 chrome/chromium:--disable-background-timer-throttling