Chrome: тайм-ауты / интервал приостановлены в фоновых вкладках?

Я проверял точность setTimeout используя этот тест. Теперь я заметил, что (как и ожидалось) setTimeout не очень точно, но для большинства приборов не очень неточно. Теперь, если я запускаю тест в Chrome и позволяю ему работать на вкладке фона (так, переключаясь на другую вкладку и просматривая там), возвращаясь к тесту и проверяя результаты te (если тест завершен), они резко меняются. Похоже, тайм-ауты идут намного медленнее. Испытания в FF4 или IE9 этого не произошло.

таким образом, похоже, что Chrome приостанавливает или, по крайней мере, замедляет выполнение javascript на вкладке, которая не имеет фокуса. В сети мало что можно было найти на эту тему. Это означало бы, что мы не можем запускать фоновые задачи, например, периодически проверять сервер с помощью вызовов XHR и setInterval (Я подозреваю, что вижу такое же поведение для setInterval, напишет тест, если время со мной).

кто-нибудь сталкивался с этим? Будет ли там обходной путь для эта подвеска / замедление? Вы бы назвали это ошибкой, и я должен подать ее как таковую?

5 ответов


Я недавно спросил об этом и это поведение по дизайну. Если вкладка неактивна, функция вызывается не более одного раза в секунду. Вот это изменить код.

возможно, это поможет: как сделать setInterval также работать, когда вкладка неактивна в Chrome?

TL; DR: использовать Веб-Работников.


есть решение использовать веб-работников, потому что они работают в отдельном процессе и не замедляются

Я написал крошечный скрипт, который можно использовать без изменений в вашем коде-он просто переопределяет функции setTimeout, clearTimeout, setInterval, clearInterval

просто включите его перед всем вашим кодом

http://github.com/turuslan/HackTimer


я обновил ядро jQuery до 1.9.1, и он решил несоответствие интервалов в неактивных вкладках. Сначала я попробую это, а затем посмотрю другие варианты переопределения кода.


Я выпустил рабочий-интервал npm пакет, который setInterval и clearInterval реализации с использованием веб-работников, чтобы идти в ногу и работает на неактивных вкладках для Chrome, Firefox и IE.

большинство современных браузеров (Chrome, Firefox и IE), интервалы (таймеры окна) зажаты, чтобы стрелять не чаще, чем один раз в секунду в неактивных вкладках.

вы можете найти более подробную информацию on

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals


воспроизведение ~пустой звук заставляет браузер сохранять производительность - я обнаружил это после прочтения этого комментария:Как заставить JavaScript работать на нормальной скорости в Chrome, даже если вкладка не активна?

Мне нужна неограниченная производительность по требованию для браузерной игры, которая использует WebSockets, поэтому я знаю по опыту, что использование WebSockets не обеспечивает неограниченную производительность, но из тестов воспроизведение аудиофайла, похоже, гарантирует это

вот 2 пустых аудио петли я создал для этой цели, вы можете использовать их свободно, коммерчески: http://adventure.земля / звуки / петли / empty_loop_for_js_performance.ogg http://adventure.земля / звуки / петли / 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,
    });
}

грустно, что нет встроенного метод включения/выключения полной производительности javascript по умолчанию, но crypto miners могут захватить все ваши вычислительные потоки, используя веб-работников без каких-либо подсказок :|