Pregunta Cómo medir el tiempo tomado por una función para ejecutar


Necesito obtener el tiempo de ejecución en milisegundos.

Originalmente formulé esta pregunta en 2008. La respuesta aceptada   entonces era usar nueva fecha (). getTime () Sin embargo, todos podemos estar de acuerdo ahora   que usando el estándar performance.now () API es más   apropiado. Por lo tanto, estoy cambiando la respuesta aceptada a esta.


786
2017-11-24 11:09


origen


Respuestas:


Puedes usar consola.tiempo: (no estándar)

console.time('someFunction');

someFunction(); // run whatever needs to be timed in between the statements

console.timeEnd('someFunction');

Nota:


1148
2017-12-29 15:05



utilizar nueva fecha (). getTime ()

El método getTime () devuelve el número de milisegundos desde la medianoche del 1 de enero de 1970.

ex.

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
// do something
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time);

572
2017-11-24 11:15



No use Fecha (). Lee abajo.

Utilizar performance.now():

<script>
var a = performance.now();
alert('do something...');
var b = performance.now();
alert('It took ' + (b - a) + ' ms.');
</script>

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 ti, pero no es estándar §:

Esta función no es estándar y no está en una pista de estándares. No lo use en sitios de producción frente a la Web: no funcionará para todos los usuarios. Ahí también pueden existir grandes incompatibilidades entre implementaciones y el comportamiento puede cambiar en el futuro.

Además del soporte del navegador, performance.now parece tener el potencial para proporcionar tiempos más precisos, ya que parece ser la versión escueta de console.time.


<rant> Además, NO UTILICES NUNCA Date para cualquier cosa porque se ve afectado por los cambios en el "tiempo del sistema". Lo que significa que será obtener resultados no válidos, como "sincronización negativa", cuando el usuario no tiene una hora precisa del sistema:

En octubre de 2014, el reloj de mi sistema se volvió loco y adivina qué.... Abrí Gmail y vi todas de los correos electrónicos de mi día "enviado Hace 0 minutos". Y pensé que se suponía que Gmail sería construido por ingenieros de primer nivel de Google .......

(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 Sala de la vergüenza para JS Date.)

Hoja de cálculo de Google now() la función también sufre de este problema.

La única vez que usarás Date es cuando quieres mostrarle al usuario su hora del reloj del sistema No cuando quieres obtener el hora o para medir cualquier cosa.


376
2018-03-26 15:49



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 localizadores 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 Cromo, prensa F12 y selecciona el Perfiles pestaña, luego Recoger JavaScript CPU Profile.
  • En Firefox, instala / abre Firebug y haz clic en Perfil botón.
  • En IE 9+, prensa F12, haga clic en Guión o Profiler (dependiendo de tu versión de IE).

Alternativamente, en su máquina de desarrollo, puedes agregar instrumentación a tu código con console.time() y console.timeEnd(). Estas funciones, compatibles con Firefox11 +, Chrome2 + e IE11 +, informan sobre temporizadores que usted inicia / detiene a través de 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 comenzó 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 el timeEnd() llamada. Los otros navegadores simplemente informan el resultado a la consola de desarrollador: el valor de retorno de timeEnd() es indefinido.

Si quieres obtener tiempo de ejecución de la función en estado salvaje, deberás instrumentar tu código. Usted tiene un par de opciones. Simplemente puede guardar las horas de inicio y fin 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 el objeto solo tiene una resolución de milisegundos y se verá afectado por los cambios de reloj del sistema 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, aka window.performance.now(). now() es mejor que el tradicional Date.getTime() de dos maneras importantes:

  1. 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 fraccionario (por ejemplo, un valor de 1000.123 es 1 segundo y 123 microsegundos).

  2. now() es monótonamente creciente. Esto es importante como Date.getTime() poder posiblemente saltar hacia adelante o incluso hacia atrás en las llamadas siguientes. 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() se garantiza que siempre será monótonamente creciente, por lo que no se verá afectado por el tiempo del sistema del sistema operativo; siempre será el reloj de pared (suponiendo que el reloj de pared no sea atómico ...).

now() se puede usar en casi todos los lugares que new Date().getTime(), + new Date y T Date.now() son. La excepción es que Date y now() los tiempos no se mezclan, como Date está basado en unix-época (la cantidad de milisegundos desde 1970), mientras now() es la cantidad de milisegundos desde que comenzó la navegación de su página (por lo que será mucho más pequeña 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 disponible.

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() usos (para que obtenga un reloj monotónicamente en aumento 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 tantas como quiera y están expuestas en el 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 luego 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 una polyfill disponible (que escribí).


44
2018-01-14 19:01



Para obtener valores precisos, debe usar 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:

var performance = window.performance;
var t0 = performance.now();
doWork();
var t1 = performance.now();
console.log("Call to doWork took " + (t1 - t0) + " milliseconds.")

Date.getTime() o console.time() no son buenos para medir el tiempo de ejecución preciso. Puede usarlos si la estimación rápida aproximada está bien para usted. Por estimación aproximada quiero decir que puede obtener un cambio de 15-60 ms del tiempo real.

Comprueba esto brillante enviar en la medición del tiempo de ejecución en JavaScript. El autor también brinda un par de enlaces sobre la precisión del tiempo de JavaScript, que vale la pena leer.


28
2018-02-26 16:13



Use Firebug, habilite tanto la consola como Javascript. Haga clic en Perfil. Recargar. Haz clic en Perfil nuevamente. Ver el informe.


17
2017-11-24 11:14



var StopWatch = function (performance) {
    this.startTime = 0;
    this.stopTime = 0;
    this.running = false;
    this.performance = performance === false ? false : !!window.performance;
};

StopWatch.prototype.currentTime = function () {
    return this.performance ? window.performance.now() : new Date().getTime();
};

StopWatch.prototype.start = function () {
    this.startTime = this.currentTime();
    this.running = true;
};

StopWatch.prototype.stop = function () {
    this.stopTime = this.currentTime();
    this.running = false;
};

StopWatch.prototype.getElapsedMilliseconds = function () {
    if (this.running) {
        this.stopTime = this.currentTime();
    }

    return this.stopTime - this.startTime;
};

StopWatch.prototype.getElapsedSeconds = function () {
    return this.getElapsedMilliseconds() / 1000;
};

StopWatch.prototype.printElapsed = function (name) {
    var currentName = name || 'Elapsed:';

    console.log(currentName, '[' + this.getElapsedMilliseconds() + 'ms]', '[' + this.getElapsedSeconds() + 's]');
};

Punto de referencia

var stopwatch = new StopWatch();
stopwatch.start();

for (var index = 0; index < 100; index++) {
    stopwatch.printElapsed('Instance[' + index + ']');
}

stopwatch.stop();

stopwatch.printElapsed();

Salida

Instance[0] [0ms] [0s]
Instance[1] [2.999999967869371ms] [0.002999999967869371s]
Instance[2] [2.999999967869371ms] [0.002999999967869371s]
/* ... */
Instance[99] [10.999999998603016ms] [0.010999999998603016s]
Elapsed: [10.999999998603016ms] [0.010999999998603016s]

performance.now () es opcional, solo pase la función de constructor StopWatch.


10
2017-08-08 18:54



process.hrtime () está disponible dentro de Node.js - devuelve un valor en nanosegundos

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

9
2018-03-11 09:49