evaluación comparativa - ¿Cómo puedo evaluar comparativamente el código JavaScript?
¿Hay algún paquete que me ayude a evaluar el rendimiento del código JavaScript? No me refiero a Firebug y herramientas similares.
Necesito comparar 2 funciones diferentes de JavaScript que he implementado. Estoy muy familiarizado con el módulo Benchmark (Benchmark.pm) de Perl y estoy buscando algo similar en JavaScript.
¿Se ha exagerado el énfasis en medir el rendimiento del código JavaScript? ¿Puedo conformarme con cronometrar solo una ejecución de las funciones?
Respuesta #1
Solo una manera simple.
console.time('test');
console.timeEnd('test');
Respuesta #2
Solo agregando un temporizador rápido a la mezcla, que alguien puede encontrar útil:
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
Idealmente se colocaría en una clase y no se usaría como una variable global como lo hice en el ejemplo anterior. Usarlo sería bastante simple:
var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console
Respuesta #3
Sólo cronometra varias iteraciones de cada función. Probablemente una iteración no será suficiente, pero (dependiendo de lo complejas que sean tus funciones) algo más cercano a 100 o incluso 1,000 iteraciones debería funcionar.
Firebug también tiene un perfilador si quieres ver qué partes de tu función la están ralentizando.
Editar: Para los futuros lectores, la respuesta a continuación que recomienda JSPerf debería ser la respuesta correcta. Yo eliminaría la mía, pero no puedo porque ha sido seleccionada por el OP. Hay mucho más en la evaluación comparativa que simplemente ejecutar muchas iteraciones, y JSPerf se encarga de eso por ti.
Respuesta #4
He estado utilizando esta implementación simple de la respuesta de @musicfreaks. No tiene funciones, pero es realmente fácil de usar. Este bench(function(){return 1/2;}, 10000, [], this) calculará 1/2 10,000 veces.
/**
* Figure out how long it takes for a method to execute.
*
* @param {Function} method to test
* @param {number} iterations number of executions.
* @param {Array} args to pass in.
* @param {T} context the context to call the method in.
* @return {number} the time it took, in milliseconds to execute.
*/
var bench = function (method, iterations, args, context) {
var time = 0;
var timer = function (action) {
var d = Date.now();
if (time < 1 || action === 'start') {
time = d;
return 0;
} else if (action === 'stop') {
var t = d - time;
time = 0;
return t;
} else {
return d - time;
}
};
var result = [];
var i = 0;
timer('start');
while (i < iterations) {
result.push(method.apply(context, args));
i++;
}
var execTime = timer('stop');
if ( typeof console === "object") {
console.log("Mean execution time was: ", execTime / iterations);
console.log("Sum execution time was: ", execTime);
console.log("Result of the method call was:", result[0]);
}
return execTime;
};
