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 для получения дополнительной информации.

Другие вопросы по тегам