Когда миллисекунд недостаточно — Performance.now

Таймер высокого разрешения был добавлен рабочей группой WebPerf, чтобы обеспечить более точные измерения на веб-платформе, чем те, которые мы имели с +new Date и более новым Date.now() .

Итак, для сравнения, вот какие значения вы получите обратно:

Date.now()         //  1337376068250
performance.now()  //  20303.427000007

Вы заметите, что два приведенных выше значения различаются на много порядков. performance.now() — это измерение миллисекунд с плавающей запятой с момента начала загрузки конкретной страницы ( performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) timeStamp, если быть точным). Вы можете возразить, что это могло быть количество миллисекунд, прошедших с эпохи Unix , но веб-приложению редко требуется знать расстояние между настоящим моментом и 1970 годом. Это число остается относительно страницы, потому что вы будете сравнивать два или более измерений. друг против друга.

Монотонное время

Еще одним дополнительным преимуществом является то, что вы можете рассчитывать на монотонность времени. Давайте позволим инженеру WebKit Тони Джентилкору объяснить это:

Случаи использования

Есть несколько ситуаций, когда вы можете использовать этот таймер с высоким разрешением вместо получения базовой отметки времени:

  • бенчмаркинг
  • код цикла запуска игры или анимации
  • точный расчет частоты кадров
  • указание действий или звука, которые должны происходить в определенных точках анимации или другой временной последовательности

Доступность

Таймер высокого разрешения в настоящее время доступен в Chrome (Stable) как window.performance.webkitNow() , и это значение обычно равно новому значению аргумента, переданному в обратный вызов requestAnimationFrame . Довольно скоро WebKit откажется от своего префикса , и он станет доступен через performance.now() . В частности, группа WebPerfWG, возглавляемая Джатиндером Манном из Microsoft, довольно быстро преуспела в удалении префиксов своих функций .

Таким образом, performance.now() - это...

  • двойной с микросекундами в дробном виде
  • относительно navigationStart страницы, а не эпохи UNIX
  • не перекашивается при изменении системного времени
  • доступен в стабильной версии Chrome, Firefox 15+ и IE10.