Pregunta

¿Hay algún paquete que me ayude a evaluar el código JavaScript? No me refiero a Firebug y esas herramientas.

Necesito comparar 2 funciones diferentes de JavaScript que he implementado. Estoy muy familiarizado con el módulo Benchmark de Perl ( Benchmark.pm ) y estoy buscando algo similar en JavaScript.

¿El énfasis en la evaluación comparativa del código JavaScript ha sido exagerado? ¿Puedo salir con la sincronización de una sola ejecución de las funciones?

¿Fue útil?

Solución

Solo tiempo varias iteraciones de cada función. Una iteración probablemente no será suficiente, pero (dependiendo de lo complejas que sean sus funciones) en algún lugar más cercano a 100 o incluso 1.000 iteraciones deberían hacer el trabajo.

Firebug también tiene un perfilador si desea ver qué partes de su función están disminuyendo hacia abajo.

Editar: Para los futuros lectores, la respuesta a continuación recomendando JSPerf debería ser la respuesta correcta. Eliminaré el mío, pero no puedo porque ha sido seleccionado por el OP. Hay mucho más en la evaluación comparativa que la ejecución de muchas iteraciones, y JSPerf se encarga de eso por usted.

Otros consejos

jsperf.com es el sitio de referencia para probar el rendimiento de JS. Empieza por ahi Si necesita un marco para ejecutar sus propias pruebas desde la línea de comandos o los scripts, utilice Benchmark.js , la biblioteca en la que se encuentra jsperf .com está construido.

Nota: cualquier persona que pruebe el código Javascript debe informarse sobre los inconvenientes de " microbenchmarks " (Pruebas pequeñas dirigidas a una función u operación específica, en lugar de pruebas más complejas basadas en patrones de código del mundo real). Dichas pruebas pueden ser útiles pero son propensas a la inexactitud debido a la forma en que funcionan los tiempos de ejecución modernos de JS. la presentación de Vyacheslav Egorov sobre desempeño y puntos de referencia vale la pena ver para sentir la naturaleza del problema (s).

Editar: Se eliminaron las referencias a mi trabajo de JSLitmus porque ya no es relevante ni útil.

Simplemente agregando un temporizador rápido a la mezcla, que alguien pueda 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 ubicaría en una clase y no se usaría como un global como lo hice con los propósitos de ejemplo anteriores. Usarlo sería bastante simple:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console

De manera sencilla.

console.time('test');
console.timeEnd('test');

He estado usando esta sencilla implementación de la respuesta de @musicfreaks. No hay características, 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;  
};

Es muy difícil escribir puntos de referencia decentes en varios navegadores. Simplemente cronometrar un número predefinido de iteraciones de su código es no es a prueba de balas en absoluto .

Como ya se sugirió @broofa, consulte jsPerf . Utiliza Benchmark.js detrás de la escena.

si escribe un guión de referencia personalizado, asegúrese de tener en cuenta que algunos navegadores aplican manipulaciones de dom solo después de que finalice la función en la que están definidos. Más detalles aquí http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

Si necesitas algo simple, puedes hacer esto:

'use strict'
console.clear()

const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)

function performanceCalc(fn, ...params) {
    const start = +new Date()
    const result = fn(...params)
    const end = +new Date()

    console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}

performanceCalc(powerOfThree, 2)

Este es un ejemplo del código

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top