В чем причина того, что JavaScript setTimeout такой неточный?

В чем причина того, что JavaScript setTimeout такой неточный?

В общем, компьютерные программы крайне ненадежны, когда пытаются выполнять вещи с точностью более 50 мс. Причина этого заключается в том, что даже на восьмипроцессорном гиперпоточном процессоре ОС обычно манипулирует несколькими сотнями процессов и потоков, иногда тысячами и более. ОС выполняет всю эту многозадачность, распределяя их все по частям процессорного времени один за другим, а это означает, что у них «максимум несколько миллисекунд», чтобы сделать свое дело ».

Простота означает, что если вы установите тайм-аут на 1000 мс, вероятность того, что текущий процесс браузера не будет запущен в тот момент времени, весьма мала, поэтому браузер не замечает, пока не будет 1005, 1010 или даже 1050 миллисекунд, что он должен выполнить данный обратный вызов.

Обычно это не проблема, это случается, и это редко имеет первостепенное значение. Если это так, все операционные системы предоставляют таймеры уровня ядра, которые намного более точны, чем 1 мс, и позволяют разработчику выполнять код точно в нужный момент времени. Однако JavaScript, как среда с высокой степенью изолированности, не имеет доступа к подобным объектам ядра, и браузеры воздерживаются от их использования, поскольку теоретически он может позволить кому-то атаковать стабильность ОС изнутри веб-страницы, аккуратно создавая код, который лишает других нити, наводнив его большим количеством опасных таймеров.

Что касается того, почему тест дает 980, я не уверен — это будет зависеть от того, какой именно браузер вы используете и какой движок JavaScript. Однако я могу полностью понять, если браузер просто вручную немного корректирует загрузку и / или скорость системы, гарантируя, что «в среднем задержка будет примерно равна правильному времени» — это будет иметь большой смысл от принципа «песочницы» до приблизительное количество времени, необходимое без нагрузки на остальную часть системы.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector