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()
y console.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:
- En Chrome , presione F12 y seleccione la pestaña Perfiles , luego Recopilar perfil de CPU de JavaScript .
- En Firefox , instale / abra Firebug y haga clic en el botón Perfil .
- En IE 9+ , presione F12 , haga clic en Script o Profiler (dependiendo de su versión de IE).
Alternativamente, en su máquina de desarrollo , puede agregar instrumentación a su código con console.time()
y console.timeEnd()
. Estas funciones, compatibles con Firefox11 +, Chrome2 + e IE11 +, informan sobre los temporizadores a través de los cuales usted inicia / detiene console.time()
. time()
toma un nombre de temporizador definido por el usuario como argumento y timeEnd()
luego informa sobre el tiempo de ejecución desde que se inició el temporizador:
function a() {
console.time("mytimer");
... do stuff ...
var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}
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 de timeEnd()
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()
:
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
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 tradicional Date.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 ya Date.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 lugares new Date().getTime()
, + new Date
y lo Date.now()
son. La excepción es que Date
y los now()
tiempos no se mezclan, ya que Date
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 que Date
).
Aquí hay un ejemplo de cómo usar now()
:
function a() {
var start = window.performance.now();
... do stuff ...
var end = window.performance.now();
var dur = end - start;
}
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()
y console.timeEnd()
, pero utiliza la misma marca de tiempo de alta resolución que now()
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 llame measure(measurename, startMarkname)
. La duración se guarda en PerformanceTimeline junto con sus marcas.
function a() {
window.performance.mark("start");
... do stuff ...
window.performance.measure("myfunctionduration", "start");
}
// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];
UserTiming está disponible en IE10 + y Chrome25 +. También hay un polyfill disponible (que escribí).