Cuando los milisegundos no son suficientes: performance.now

El cronómetro de alta resolución fue agregado por el grupo de trabajo WebPerf para permitir mediciones en la plataforma web 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 muy diferentes en términos de magnitud. performance.now() es una medición de milisegundos de punto flotante desde que comenzó a cargarse esa página en particular (la marca de tiempo performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) para ser más específicos). Podrías argumentar que podría haber sido la cantidad de milisegundos desde la época de Unix, pero rara vez una app web necesita conocer la distancia entre el momento actual y 1970. Este número se mantiene en relación con la página porque compararás dos o más mediciones entre sí.

Tiempo monotónico

Otro beneficio adicional es que puedes confiar en que el tiempo sea monótono. Permite que Tony Gentilcore, ingeniero de WebKit, explique esto:

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
  • Cómo calcular la velocidad de fotogramas con precisión
  • insertar acciones o audio para que ocurran en puntos específicos de una animación o de otra secuencia basada en el tiempo

Disponibilidad

Actualmente, el temporizador de alta resolución está disponible en Chrome (estable) como window.performance.webkitNow(), y este valor suele ser igual al valor del argumento nuevo que se pasa a la devolución de llamada de requestAnimationFrame. Pronto, WebKit dejará de usar su prefijo y estará disponible a través de performance.now(). En particular, el WebPerfWG, dirigido por Jatinder Mann de Microsoft, tuvo mucho éxito en quitar los prefijos de sus funciones con bastante rapidez.

En resumen, performance.now() es lo siguiente:

  • un número doble con microsegundos en la parte fraccionaria
  • en relación con el navigationStart de la página en lugar de la época de UNIX
  • no se vea afectada cuando cambie la hora del sistema
  • disponible en Chrome estable, Firefox 15 y versiones posteriores, y IE10.