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


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

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

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

5 102

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), интервалы (оконные таймеры) зажимаются для запуска не чаще одного раза в секунду в неактивных вкладках.

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

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 не работает)

Я играю их, по требованию пользователя, с ревуном.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 по умолчанию, но крипто-майнеры могут захватить все ваши вычислительные потоки с помощью веб-работников без каких-либо подсказок :|