Domanda

Esiste un pacchetto che mi aiuta a confrontare il codice JavaScript? Non mi riferisco a Firebug e strumenti simili.

Devo confrontare 2 diverse funzioni JavaScript che ho implementato. Conosco molto bene il modulo Perl's Benchmark ( Benchmark.pm ) e sto cercando qualcosa di simile in JavaScript.

L'enfasi sul benchmarking del codice JavaScript è stata esagerata? Posso cavarmela con il cronometraggio solo una corsa delle funzioni?

È stato utile?

Soluzione

Solo tempo diverse iterazioni di ciascuna funzione. Probabilmente una iterazione non sarà sufficiente, ma (a seconda della complessità delle funzioni) in qualche luogo più vicino a 100 o addirittura 1.000 iterazioni dovrebbe fare il lavoro.

Firebug ha anche un profiler se vuoi vedere quali parti della tua funzione stanno rallentando giù.

Modifica: ai futuri lettori, la risposta di seguito che consiglia JSPerf dovrebbe essere la risposta corretta. Vorrei eliminare il mio, ma non posso perché è stato selezionato dall'OP. C'è molto di più nel benchmarking oltre a eseguire molte iterazioni e JSPerf se ne occupa per te.

Altri suggerimenti

jsperf.com è il sito di riferimento per testare le prestazioni di JS. Inizia lì. Se hai bisogno di un framework per eseguire i tuoi test dalla riga di comando o dagli script usa Benchmark.js , la libreria su cui jsperf .com è stato creato.

Nota: chiunque esegua il test del codice Javascript dovrebbe informarsi sulle insidie ??di "microbenchmarks". (piccoli test mirati a una specifica funzionalità o operazione, piuttosto che test più complessi basati su modelli di codice del mondo reale). Tali test possono essere utili ma sono soggetti a inesattezze a causa di come funzionano i runtime JS moderni. La presentazione di Vyacheslav Egorov su prestazioni e benchmarking vale la pena guardare per avere un'idea della natura dei problemi.

Modifica: i riferimenti rimossi al mio JSLitmus funzionano perché non sono più pertinenti o utili.

Basta aggiungere un timer rapido al mix, che qualcuno potrebbe trovare utile:

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 sarebbe collocato in una classe e non usato come globale come ho fatto per esempio sopra. Usarlo sarebbe piuttosto semplice:

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

Solo un modo semplice.

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

Ho usato questa semplice implementazione della risposta @musicfreaks. Non ci sono funzionalità, ma è davvero facile da usare. Questo banco (funzione () {return 1/2;}, 10000, [], this) calcolerà 1/2 10.000 volte.

/**
 * 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;  
};

È davvero difficile scrivere benchmark decenti tra browser. Il semplice cronometraggio di un numero predefinito di iterazioni del codice è non assolutamente a prova di proiettile .

Come già suggerito da @broofa, controlla jsPerf . Utilizza Benchmark.js dietro le quinte.

se si scrive uno script di benchmark personalizzato accertarsi che alcuni browser applichino le manipolazioni del dom solo dopo la fine della funzione in cui sono definiti. Maggiori dettagli qui http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

Se hai bisogno di qualcosa di semplice puoi fare così:

'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)

Ecco un esempio del codice

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top