Я проверял точность setTimeout
использования этого теста . Теперь я заметил, что (как и ожидалось) setTimeout
не очень точный, но для большинства приборов не очень точный. Теперь, если я запускаю тест в Chrome и позволяю ему работать в фоновой вкладке (так, переключаясь на другую вкладку и просматривая ее), возвращаюсь к тесту и проверяю результаты (если тест завершен), они кардинально изменяются. Похоже, что таймауты стали намного медленнее. При тестировании в FF4 или IE9 этого не произошло.
Таким образом, похоже, что Chrome приостанавливает или, по крайней мере, замедляет выполнение javascript на вкладке, у которой нет фокуса. Не удалось найти в сети много информации по этой теме. Это означало бы, что мы не можем запускать фоновые задачи, такие как, например, периодическая проверка на сервере с помощью вызовов XHR и setInterval
(я подозреваю, что вижу такое же поведение setInterval
, напишет тест, если время со мной).
Кто-нибудь сталкивался с этим? Есть ли способ обхода этой приостановки / замедления? Вы бы назвали это ошибкой, и я должен зарегистрировать это как таковую?
источник
transition
, поэтому не все div переходят одновременно, а на самом деле через 15 мс после каждого, создавая некоторый эффект качения. Когда я перехожу на другую вкладку и возвращаюсь через некоторое время, все блоки div переходят одновременно, иsetTimeOut
полностью игнорируется. Это не большая проблема для моего проекта, но странное и нежелательное дополнение.Ответы:
Я недавно спросил об этом, и это поведение по замыслу. Когда вкладка неактивна, функция вызывается не чаще одного раза в секунду. Вот изменение кода .
Возможно, это поможет: как сделать так, чтобы setInterval также работал, когда вкладка в Chrome неактивна?
TL; DR: используйте веб-воркеров .
источник
Есть решение использовать Web Workers, потому что они выполняются в отдельном процессе и не замедляются.
Я написал крошечный скрипт, который можно использовать без изменения вашего кода - он просто переопределяет функции setTimeout, clearTimeout, setInterval, clearInterval
Просто включите его перед всем своим кодом
http://github.com/turuslan/HackTimer
источник
new Worker('data:text/javascript,(' + function myWorkerCode () { /*...*/ } + '()')
, Это также хороший способ проверить, есть ли у вас поддержка выражений импорта:try { eval('import("data:text/javascript,void 0")') } catch (e) { /* no support! */ }
Воспроизведение пустого звука заставляет браузер сохранять производительность - я обнаружил это после прочтения этого комментария: Как заставить 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
(Они включают шум -58 дБ, -60 дБ не работает)
Я играю в них по запросу пользователя с помощью Howler.js: https://github.com/goldfire/howler.js
Печально, что нет встроенного метода для включения / выключения полной производительности javascript по умолчанию, тем не менее, крипто-майнеры могут захватить все ваши вычислительные потоки с помощью Web Workers без какого-либо запроса: |
источник
Я выпустил пакет npm с рабочим интервалом , который реализует setInterval и clearInterval с использованием Web-Workers, чтобы поддерживать работу на неактивных вкладках для 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
источник
Я обновил ядро jQuery до версии 1.9.1, и это устранило несоответствие интервалов в неактивных вкладках. Сначала я попробую это, а затем изучу другие варианты переопределения кода.
источник
вот мое решение, которое получает текущую миллисекунду и сравнивает ее с миллисекундами, в которые была создана функция. для интервала он обновит миллисекунды при запуске функции. вы также можете получить интервал / тайм-аут по идентификатору.
источник