¿Cuál es la diferencia entre performance.now() y Date.now() ?
¿Debería considerar performance.now() como reemplazo de Date.now() ya que performace.now() es más consistente e independiente?
Ambos sirven para diferentes propósitos.
performance.now() es relativo a la carga de la página y más preciso en órdenes de magnitud. Los casos de uso incluyen evaluación comparativa y otros casos en los que se requiere un tiempo de alta resolución, como medios (juegos, audio, video, etc.)
Cabe señalar que performance.now() solo está disponible en los navegadores más nuevos (incluido IE10+).
Date.now() es relativo a la época de Unix (1970-01-01T00:00:00Z) y depende del reloj del sistema. Los casos de uso incluyen la misma manipulación de fechas desde el comienzo de JavaScript.
Consulte Cuando los milisegundos no son suficientes performance.now método performance.now and now (Internet Explorer) - MSDN para obtener más información.
La especificación oficial de W3C se puede encontrar aquí: API de tiempo de alta resolución
Date.now() devuelve la cantidad de milisegundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC, performance.now() devuelve la cantidad de milisegundos, con microsegundos en la parte fraccionaria, desde performance.timing.navigationStart , el inicio de navegación del documento, a la llamada performance.now() . Otra diferencia importante entre Date.now() y performance.now() es que este último aumenta monótonamente, por lo que la diferencia entre dos llamadas nunca será negativa.
Para una mejor comprensión visita el enlace .
Lo primero que noté fue que performance.now() es 4 veces más lento que Date.now() (400k operaciones frente a 100k en mi computadora). Sin embargo, si solo está contando, usar performance.now() es la mejor opción. Depende puramente del tiempo desde que el código comenzó a ejecutarse, y los cambios de reloj no afectan el tiempo. También es más preciso: contarnos (microsegundos) en lugar de ms.
En cuanto al soporte, Date.now() tiene un poco más de soporte que performance.now() , ya que ambos son compatibles con los navegadores modernos e incluso con IE10/11 .
new Date().getTime() tiene aún más soporte (solo un poco) y es 2 veces más lento que Date.now Date.now() . Es más lento porque crea un objeto y luego llama a algo.
Sin embargo, esta página de caniuse.com muestra que performance.now() casi siempre está bien, en el 97,9 % (a partir de ahora) de los casos.
(De aquí en adelante solo me referiré a Date.now() , pero new Date.getTime() es lo mismo en los casos a continuación)
Uso
Date.now() puede (y debe) usarse para darse cuenta de si ha pasado algún tiempo, suponiendo que la velocidad sea una preocupación (muy importante): puede obtener fácilmente el cuadro correcto en una computadora de 60 fps. también puede servir para relojes. Cuenta cuántos milisegundos han pasado desde la época de Unix (ver la respuesta superior). Para aplicaciones que requieren un poco más de precisión (ver más abajo), se puede usar performance.now() . Se comporta exactamente igual que Date.now() si está usando un temporizador (porque todavía cuenta en milisegundos), excepto que es más preciso. Para usar performance.now() como un Date.now() u objeto (ligeramente) más preciso, agregue performance.timing.navigationStart al valor. Esto parece estar a unos pocos milisegundos del objeto Date.now() , pero no estoy seguro de quién es el culpable.
Exactitud
Por lo que puedo decir, performance.now() es solo 10 veces más preciso en comparación con Date.now() en mi escritorio Chrome: considerando saltos de tiempo de 0.1ms, sin embargo, esta precisión es lo suficientemente buena para la mayoría de las aplicaciones basadas en el tiempo. (Lea la sección de Firefox para obtener más información sobre su precisión) Puede parecer más preciso, pero no lo es: está intencionalmente limitado por razones de seguridad, ya que la explotación del tiempo podría permitir que usuarios maliciosos accedan a otras aplicaciones .
Firefox
Lamentablemente, este rendimiento (de 0,1 ms) no es posible si tiene usuarios de Firefox y no tiene acceso a encabezados de origen cruzado. Para habilitarlo, coloque Cross-Origin-Opener-Policy: same-origin y Cross-Origin-Embedder-Policy: require-corp en su documento. Los usuarios también pueden aumentar esta velocidad a 100 ms (o más). Visite la documentación de Mozilla para obtener más información.