Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Как имитировать тормозной браузер, искажающий JS timeout / interval?

#javascript #таймер


Пишу таймер, который тикает раз в секунду, и должен это делать с точностью до 1/200
секунды. Даже если браузер тупит и комп слабый.

Поэтому ориентируюсь не на setTimeout( func, 1000), а на более частые вызовы и системное
время в миллисекундах.

Вопрос – как тестировать? Надо как-то имитировать разную степень тормознутости системы,
чтобы оценить поведение скрипта в разных условиях. И записывать в консоль отклонения
в миллисекундах от идеального времени каждого тика.



Upd. В этом алгоритме я внутри каждой секунды несколько раз запускаю setTimeout()
на время, меньшее 1000, и зависящее от расхождения фактического и ожидаемого времени
очередного запуска, и времени оставшегося до «конца» секунды.

Гипотеза: тормоза системы не меняются значительно в «окне» одной секунды. Тогда,
выполнив несколько коротких (200-500ms) предварительных setTimeout(), можно чуть правильнее
предположить лаг следующего, и точнее попасть в нужное время

Upd. 2 нашёл интересный совет – тестировать в виртуальной машине, в которой урезать
ресурсы.
    


Ответы

Ответ 1



!function() { var delta = 100; // Интервал будет плюс-минус 100 милисекунд var ost = setTimeout setTimeout = function(f, time) { time += (Math.random() * 2 - 1) * delta ost(f, time) } }() Но, вообще говоря, ваше решение довольно странное. Более частые вызовы приведут лишь к большей загрузки и так тормознутой системы, и не помогут отмерить интервалы точнее. Браузер же "тупит" не просто так - а потому что процессор занят чем-то еще. И если в некоторый момент времени процессор занят - то скрипт проснется невовремя независимо от того, на 20 миллисекунд скрипт засыпал или на 1000.

Ответ 2



Возможно вам стоит загрузить систему параллельно дополнительными вычислениями на основе тех же таумаутов. Например что-то вроде этого function noise() { var count = Math.random() * 1000000; // какая-то нагрузка for(var i=0;i

Ответ 3



Если на браузере chrome переключиться в режим просмотр кода (инспектор), переходите в режим телефона/планшета и выбираете скорость 50 КВ/s. Тормоза обеспечены. Скриншот с красными стрелками http://prnt.sc/8x4el4

Комментариев нет:

Отправить комментарий