Cuando los milisegundos no son suficientes: performance.now

El grupo de trabajo de WebPerf agregó el Temporizador de alta resolución para permitir mediciones en la plataforma web que son más precisas que las que teníamos con +new Date y el Date.now() más reciente.

A modo de comparación, estos son los tipos de valores que obtendrías:

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

Notarás que los dos valores anteriores son diferentes órdenes de magnitud. performance.now() es una medición de milisegundos de punto flotante desde que esa página en particular comenzó a cargarse (la marca de tiempo performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) es específica). Se podría argumentar que podría haber sido la cantidad de milisegundos desde la época Unix, pero rara vez una aplicación web necesita conocer la distancia entre ahora y 1970. Este número se relaciona con la página porque compararás dos o más mediciones entre sí.

Hora monótona

Otro beneficio adicional es que el tiempo es monótono. Dejemos que el ingeniero de WebKit, Tony Gentilcore, lo explique:

Casos de uso

Hay algunas situaciones en las que usarías este temporizador de alta resolución en lugar de tomar una marca de tiempo básica:

  • comparativas
  • código de bucle de ejecución de juego o animación
  • calcular la velocidad de fotogramas con precisión
  • acciones de inserción o audio para que ocurran en puntos específicos de una animación o de otra secuencia basada en el tiempo

Disponibilidad

Por el momento, el temporizador de alta resolución está disponible en Chrome (estable) como window.performance.webkitNow() y, por lo general, es igual al nuevo valor de argumento que se pasa a la devolución de llamada requestAnimationFrame. Muy pronto, WebKit quitará su prefijo, que estará disponible a través de performance.now(). El WebPerfWG en particular, dirigido por Jatinder Mann de Microsoft, ha exitoso mucho quitar los prefijos de sus funciones con bastante rapidez.

En resumen, performance.now() es...

  • el doble con microsegundos en el
  • en relación con el navigationStart de la página, y no con la época UNIX
  • no sesgada cuando la hora del sistema cambia
  • disponible en la versión estable de Chrome, Firefox 15 o versiones posteriores, e IE10.