Necesito obtener el tiempo de ejecución en milisegundos.
Originalmente hice esta pregunta en 2008. La respuesta aceptada era usar la nueva Fecha (). GetTime () Sin embargo, ahora todos podemos estar de acuerdo en que usar la API estándar performance.now () es más apropiado. Por lo tanto, estoy cambiando la respuesta aceptada a esta.
javascript
profiling
Julio A
fuente
fuente
Date
manera clásica , que te dams
y es suficiente para la mayoría de los casos, creo que albertech.blogspot.com/2015/07/… ... pero sí, realmente deberías mirarPerformance.now
performance.now()
No funciona en el nodo.new Date().getTime()
Trabajará en Nodo.Respuestas:
Usando performance.now () :
Usando console.time :
(no estándar)( nivel de vida )Nota :
La cadena que se pasa a losmétodos
time()
ytimeEnd()
debe coincidir(para que el temporizador termine como se esperaba).
fuente
use new Date (). getTime ()
ex.
fuente
window.performance.now
. Ver stackoverflow.com/a/15641427/632951No use Fecha (). Lee abajo.
Uso
performance.now()
:Funciona en:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
etcétera etcétera
console.time
puede ser viable para usted , pero no es estándar § :Además del soporte del navegador,
performance.now
parece tener el potencial de proporcionar tiempos más precisos, ya que parece ser la versión básicaconsole.time
.<rant> Además, NUNCA lo use
Date
para nada porque está afectado por cambios en el "tiempo del sistema". Lo que significa que vamos a obtener resultados válidos -como "el momento negativo" - cuando el usuario no tiene un tiempo del sistema exacto:(Configure el reloj de su sistema hace un año y vaya a Gmail para que todos podamos reírnos. Quizás algún día tengamos un Salón de la Vergüenza para JS
Date
).La
now()
función de hoja de cálculo de Google también sufre este problema.El único momento que usará
Date
es cuando desea mostrarle al usuario la hora del reloj de su sistema. No cuando quieres tener el tiempo o medir algo.fuente
Si necesita obtener el tiempo de ejecución de la función en su máquina de desarrollo local , puede usar las herramientas de creación de perfiles de su navegador o comandos de consola como
console.time()
yconsole.timeEnd()
.Todos los navegadores modernos tienen perfiles de JavaScript incorporados. Estos perfiladores deberían proporcionar la medición más precisa ya que no tiene que modificar su código existente, lo que podría afectar el tiempo de ejecución de la función.
Para perfilar tu JavaScript:
Alternativamente, en su máquina de desarrollo , puede agregar instrumentación a su código con
console.time()
yconsole.timeEnd()
. Estas funciones, compatibles con Firefox11 +, Chrome2 + e IE11 +, informan sobre los temporizadores a través de los cuales usted inicia / detieneconsole.time()
.time()
toma un nombre de temporizador definido por el usuario como argumento ytimeEnd()
luego informa sobre el tiempo de ejecución desde que se inició el temporizador:Tenga en cuenta que solo Firefox devuelve el tiempo transcurrido en la
timeEnd()
llamada. Los otros navegadores simplemente informan el resultado a la consola del desarrollador: el valor de retorno detimeEnd()
no está definido.Si desea obtener el tiempo de ejecución de la función en la naturaleza , deberá instrumentar su código. Usted tiene un par de opciones. Simplemente puede guardar las horas de inicio y finalización consultando
new Date().getTime()
:Sin embargo, el
Date
objeto solo tiene una resolución de milisegundos y se verá afectado por los cambios en el reloj del sistema operativo de cualquier sistema operativo. En los navegadores modernos, hay una mejor opción.La mejor opción es usar el tiempo de alta resolución , también conocido como
window.performance.now()
.now()
es mejor que el tradicionalDate.getTime()
en dos formas importantes:now()
es una resolución doble con submilisegundos que representa el número de milisegundos desde el inicio de la navegación de la página. Devuelve el número de microsegundos en el fraccional (por ejemplo, un valor de 1000.123 es 1 segundo y 123 microsegundos).now()
Está aumentando monotónicamente. Esto es importante yaDate.getTime()
que posiblemente puede saltar hacia adelante o incluso hacia atrás en llamadas posteriores. En particular, si la hora del sistema del sistema operativo se actualiza (por ejemplo, la sincronización del reloj atómico),Date.getTime()
también se actualiza.now()
está garantizado que siempre aumentará monotónicamente, por lo que no se verá afectado por la hora del sistema del sistema operativo; siempre será la hora del reloj de pared (suponiendo que su reloj de pared no sea atómico ...).now()
se puede usar en casi todos los lugaresnew Date().getTime()
,+ new Date
y loDate.now()
son. La excepción es queDate
y losnow()
tiempos no se mezclan, ya queDate
se basa en unix-epoch (el número de milisegundos desde 1970), mientras quenow()
es el número de milisegundos desde que comenzó la navegación de su página (por lo que será mucho menor queDate
).Aquí hay un ejemplo de cómo usar
now()
:now()
es compatible con Chrome estable, Firefox 15+ e IE10. También hay varios polyfills disponibles.Otra opción para medir el tiempo de ejecución en la naturaleza es UserTiming . UserTiming se comporta de manera similar a
console.time()
yconsole.timeEnd()
, pero utiliza la misma marca de tiempo de alta resolución quenow()
usa (por lo que obtiene un reloj que aumenta monotónicamente por debajo de milisegundos), y guarda las marcas de tiempo y duraciones en el PerformanceTimeline .UserTiming tiene los conceptos de marcas ( marcas de tiempo) y medidas (duraciones). Puede definir tantos como desee, y se exponen en PerformanceTimeline .
Para guardar una marca de tiempo, llame
mark(startMarkName)
. Para obtener la duración desde su primera marca, simplemente llamemeasure(measurename, startMarkname)
. La duración se guarda en PerformanceTimeline junto con sus marcas.UserTiming está disponible en IE10 + y Chrome25 +. También hay un polyfill disponible (que escribí).
fuente
performance.now
yDate
es la razón por la que existe.Para obtener valores precisos, debe usar la interfaz de rendimiento . Es compatible con las versiones modernas de Firefox, Chrome, Opera e IE. Aquí hay un ejemplo de cómo se puede usar:
Date.getTime()
oconsole.time()
no son buenos para medir el tiempo de ejecución preciso. Puede usarlos si el cálculo aproximado rápido está bien para usted. Por estimación aproximada quiero decir que puede obtener un cambio de 15-60 ms del tiempo real.Consulte esta brillante publicación sobre la medición del tiempo de ejecución en JavaScript. El autor también ofrece un par de enlaces sobre la precisión del tiempo de JavaScript, que vale la pena leer.
fuente
Usa Firebug, habilita tanto la consola como Javascript. Haz clic en Perfil. Recargar. Haga clic en Perfil nuevamente. Ver el informe
fuente
console.time()
yconsole.timeEnd()
también ahora.Punto de referencia
Salida
performance.now () es opcional; simplemente pase false a la función de constructor StopWatch.
fuente
process.hrtime () está disponible en Node.js : devuelve un valor en nanosegundos
fuente
hrtime[0] * 1000 + hrtime[1] / 1000000
-> sí, ¡prefiero usarlovar hrtime
también! : Ppuedes usar agregar operador también aquí
fuente
Para extender aún más el código de vsync para tener la capacidad de devolver el tiempo final como un valor en NodeJS, use este pequeño fragmento de código.
Ahora usa el código así:
Esto te da más posibilidades. Puede almacenar el tiempo de ejecución para usarlo con más fines, como usarlo en ecuaciones, o almacenarlo en una base de datos, enviarlo a un cliente remoto a través de sockets web, servirlo en una página web, etc.
fuente
Es posible usar solo una variable:
timer/1000
- convertir milisegundos a segundos.toFixed(5)
- para recortar dígitos adicionalesfuente
Desde entonces
console.time
yperformance.now
no son compatibles con algunos de los principales navegadores (es decir, IE10), creé una utilidad delgada que utiliza los mejores métodos disponibles. Sin embargo, carece de manejo de errores para usos falsos (llamandoEnd()
a un temporizador no inicializado).Úsalo y mejóralo como quieras.
fuente
Te puede ayudar.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
fuente
Aquí hay un decorador para funciones de temporización
Uso:
Si está utilizando funciones asíncronas, puede hacer
timed
asíncrono y agregar unawait
antes f (... args), y eso debería funcionar para ellos. Se vuelve más complicado si desea que un decorador maneje las funciones de sincronización y asíncrona.fuente
Gracias, Achim Koellner, ampliará un poco su respuesta:
Tenga en cuenta que no debe hacer nada aparte de lo que desea medir (por ejemplo,
console.log
también llevará tiempo ejecutarlo y afectará las pruebas de rendimiento).Tenga en cuenta que, en orden por medida de tiempo de ejecución de funciones asíncronas, debe insertar
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
dentro de la devolución de llamada. Por ejemplo,fuente
Hace un par de meses, armé mi propia rutina que sincroniza una función usando Date.now (), aunque en ese momento el método aceptado parecía ser performance.now (), porque el objeto de rendimiento aún no está disponible (construido -in) en la versión estable de Node.js.
Hoy estaba investigando un poco más y encontré otro método para medir el tiempo. Como también encontré cómo usar esto en el código Node.js, pensé en compartirlo aquí.
Lo siguiente se combina de los ejemplos dados por w3c y Node.js :
NOTA:
Si tiene la intención de utilizar el
performance
objeto en una aplicación Node.js, debe incluir los siguientes requisitos:const { performance } = require('perf_hooks')
fuente
performance.mark('end')
en este casoHay varias formas de lograr este objetivo:
usando console.time
esta es la forma más eficiente: usando performance.now () , por ejemplo
use + (agregar operador) o getTime ()
Esto es lo que sucede cuando aplica el operador unario más a una instancia de Fecha: Obtenga el valor de la instancia de Fecha en cuestión Conviértalo en un Número
NOTA:
getTime()
ofrece un mejor rendimiento que el operador unario +.fuente
InitTime relacionado con
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
fuente
Si desea medir el tiempo entre varias cosas que no están anidadas, puede usar esto:
Similar a console.time (), pero de uso más fácil si no necesita hacer un seguimiento de los temporizadores anteriores.
Si le gusta el color azul de console.time (), puede usar esta línea en su lugar
fuente
En mi caso, prefiero usar @ grammar suger y compilarlo con babel.
El problema de este método es que la función tiene que estar dentro del objeto.
Código JS de muestra
.babelrc (para babel 6)
fuente
Cronómetro con ciclos acumulativos
Funciona con servidor y cliente (Nodo o DOM), utiliza el
Performance
API. Es bueno cuando tiene muchos ciclos pequeños, por ejemplo, en una función llamada 1000 veces que procesa 1000 objetos de datos pero desea ver cómo cada operación en esta función se suma al total.Entonces este usa un temporizador global de módulo (singleton). Igual que un patrón singleton de clase, un poco más simple de usar, pero debe ponerlo en un
stopwatch.js
archivo separado, por ejemplo .fuente
La mejor manera sería usar el
performance hooks
módulo. Aunque inestable, puedemark
áreas específicas de su código ymeasure
elduration
entre las áreas marcadas.Intenta aqui
fuente
fuente
Con rendimiento
NodeJs: se requiere para importar la clase de rendimiento
Usando console.time
fuente
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Puede leer más sobre esto en MDN y en la documentación de Node.js .
Disponible en Chrome, Firefox, Opera y NodeJS. (no en Edge o Internet Explorer).
fuente
Como se indicó anteriormente, verifique y use el temporizador incorporado. Pero si quieres o necesitas escribir el tuyo aquí están mis dos centavos:
¡La compilación fue un éxito!
fuente
¡La respuesta aceptada es incorrecta !
Dado que JavaScript es asíncrono, los valores del extremo variable de la respuesta aceptada serían incorrectos.
La ejecución de for puede ser muy rápida, por lo que no puede ver que el resultado es incorrecto. Puede probarlo con un código haciendo alguna solicitud:
Por lo tanto, la alerta se activará rápidamente, pero en la consola verá que las solicitudes de ajax continúan.
Así es como debes hacerlo: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
fuente