performance.now() против Date.now()
В чем разница между performance.now()
а также Date.now()
?
Должен ли я рассмотреть performance.now()
в качестве замены Date.now()
поскольку performace.now()
является более последовательным и независимым?
3 ответа
Они оба служат разным целям.
performance.now()
относится к загрузке страницы и точнее по порядку величины. Варианты использования включают в себя бенчмаркинг и другие случаи, когда требуется время с высоким разрешением, такое как медиа (игры, аудио, видео и т. Д.)
Следует отметить, что performance.now()
доступно только в новых браузерах (включая IE10+).
Date.now()
относится к эпохе Unix (1970-01-01T00:00:00Z) и зависит от системных часов. Варианты использования включают в себя те же самые старые манипуляции с датой с начала JavaScript.
Смотрите, когда миллисекунд недостаточно:performance.now
а также now
Метод (Internet Explorer) - MSDN для получения дополнительной информации.
Официальную спецификацию W3C можно найти здесь: High Resolution Time API
Date.now()
возвращает количество миллисекунд, прошедших с 1 января 1970 года 00:00:00 UTC, performance.now()
возвращает количество миллисекунд, с микросекундами в дробной части, из performance.timing.navigationStart
, начало навигации документа, к performance.now()
вызов. Еще одно важное различие между Date.now()
а также performance.now()
является то, что последний монотонно увеличивается, поэтому разница между двумя вызовами никогда не будет отрицательной.
Для лучшего понимания перейдите по ссылке.
Первое, что я заметил, это то, что это в 4 раза медленнее, чем (400 тыс. операций против 100 тыс. на моем компьютере). Однако, если вы просто считаете, использование — лучший вариант. Это полностью зависит от времени, прошедшего с момента запуска кода, и изменения часов не влияют на время. Это также более точно: считать нас (микросекунды) вместо мс.
Что касается поддержки, у него немного больше поддержки, чем у , так как оба поддерживаются современными браузерами и даже IE10/11.
new Date().getTime()
имеет еще большую поддержку (совсем немного) и в 2 раза медленнее, чем . Это медленнее, потому что он создает объект, а затем что-то вызывает.
Тем не менее, эта страница caniuse.com показывает, что это почти всегда нормально, в 97,9% (на данный момент) случаев.
(С этого момента я буду ссылаться только на , но
new Date.getTime()
то же самое в случаях ниже)
Применение
может (и должен) использоваться для понимания того, прошло ли какое-то время, при условии, что скорость имеет (очень серьезное) значение: он может легко получить правильный кадр на компьютере со скоростью 60 кадров в секунду. Его также можно использовать для часов. Он подсчитывает, сколько миллисекунд прошло с эпохи Unix (см. верхний ответ). Для приложений, требующих большей точности (см. ниже), можно использовать . Он ведет себя точно так же, как если бы вы использовали таймер (потому что он по-прежнему считает миллисекунды), за исключением того, что он более точен. Чтобы использовать как (немного) более точный или объект, добавьте
performance.timing.navigationStart
к значению. Кажется, что это несколько миллисекунд от объекта, но чья это вина, я не уверен.
Точность
Из того, что я могу сказать,
performance.now()
всего в 10 раз точнее по сравнению с
Date.now()
на моем рабочем столе Chrome: с учетом временных скачков в 0,1 мс. Однако этой точности достаточно для большинства приложений, основанных на времени. (Читайте раздел Firefox для получения дополнительной информации об их точности) Это может выглядеть более точным, но это не так: оно намеренно ограничено из соображений безопасности, поскольку использование времени может позволить злоумышленникам получить доступ к другим приложениям .
Fire Fox
К сожалению, такая производительность (0,1 мс) невозможна , если у вас есть пользователи Firefox и нет доступа к заголовкам Cross-Origin. Чтобы включить его, поставьте
Cross-Origin-Opener-Policy: same-origin
а также
Cross-Origin-Embedder-Policy: require-corp
в вашем документе. Пользователи также могут увеличить эту скорость до 100 мс (или выше). Посетите документацию Mozilla для получения дополнительной информации.