Не использовать new Date()
Этот API имеет несколько недостатков и полезен только для получения текущей даты + времени. Не для измерения временных интервалов.
Date-API использует внутренние часы операционной системы, которые постоянно обновляются и синхронизируются с серверами времени NTP. Это означает, что частота / частота этих часов иногда выше, а иногда медленнее, чем фактическое время, и, следовательно, не может использоваться для измерения длительности и частоты кадров.
Если кто-то изменит системное время (вручную или из-за перехода на летнее время), вы, по крайней мере, увидите проблему, если одному кадру вдруг понадобится час. Или отрицательное время. Но если системные часы тикают на 20% быстрее, чтобы синхронизироваться с мировым временем, это практически невозможно обнаружить.
Кроме того, Date-API очень неточен - часто намного меньше, чем 1 мс. Это делает его особенно бесполезным для измерений частоты кадров, когда один кадр 60 Гц требует ~ 17 мс.
Performance API был специально создан для таких случаев использования и может использоваться эквивалентно new Date()
. Просто возьмите один из ответов и замените new Date()
на performance.now()
, и вы готовы к работе.
Источники:
Также в отличие от Date.now (), значения, возвращаемые Performance.now ()
всегда увеличивается с постоянной скоростью, независимо от системных часов
(который может быть скорректирован вручную или искажен программным обеспечением, таким как NTP).
В противном случае, performance.timing.navigationStart + performance.now () будет
быть примерно равным Date.now ().
https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
и для windows:
[Служба времени] регулирует местную частоту часов, чтобы позволить ей
сходиться к правильному времени.
Если разница во времени между местными часами и [точной временной выборкой] слишком велика, чтобы скорректировать ее, отрегулировав местную
тактовая частота,
служба времени устанавливает местное время на правильное время.
https://technet.microsoft.com/en-us/library/cc773013(v=ws.10).aspx