Pergunta

Existe um pacote que me ajuda a referência de código JavaScript? Eu não estou me referindo a Firebug e tais ferramentas.

Eu preciso comparar 2 funções de JavaScript diferentes que eu tenho implementado. Estou muito familiarizado com Benchmark Perl ( Benchmark.pm ) módulo e eu estou procurando algo em semelhante JavaScript.

Tem a ênfase na análise comparativa código JavaScript ao mar foi? I pode ir longe com o tempo apenas uma corrida das funções?

Foi útil?

Solução

Apenas tempo várias iterações de cada função. Uma iteração provavelmente não será suficiente, mas (dependendo do quão complexo suas funções são) em algum lugar perto de 100 ou mesmo 1.000 iterações deve fazer o trabalho.

Firebug também tem um profiler se você quiser ver quais partes do seu função estão retardando -lo.

Editar: Para futuros leitores, a seguir resposta recomendando JSPerf deve ser a resposta correta. Eu iria apagar o meu, mas não posso porque foi selecionado pelo OP. Há muito mais para aferição do que apenas executar muitas iterações, e JSPerf cuida disso para você.

Outras dicas

jsperf.com é o go-to lugar para testar o desempenho JS. Começar por aí. Se você precisa de um quadro para a execução de seus próprios testes a partir da linha de comando ou scripts usam Benchmark.js , a biblioteca sobre a qual JSPerf .com é construído.

Nota: Qualquer um teste de código Javascript deve educar-se sobre as armadilhas de "microbenchmarks" (pequenos testes que visam um recurso ou operação específica, ao invés de testes mais complexos com base em padrões de código do mundo real) . Esses testes podem ser úteis, mas são propensas a imprecisão devido à forma como moderno JS tempos de execução operar. apresentação de Vyacheslav Egorov no desempenho e benchmarking vale a pena assistir para começar uma sensação para a natureza do problema (s).

Editar:. referências removido para o meu trabalho JSLitmus como é apenas não é mais relevante ou útil

Basta adicionar um temporizador rápida à mistura, que alguém pode achar ú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');
        }
    }
};

O ideal seria colocado em uma classe, e não usado como um global como eu fiz para fins de exemplo acima. Usando seria muito simples:

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

Apenas maneira simples.

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

Tenho vindo a utilizar este simples implementação de @musicfreaks resposta. Não há recursos, mas é realmente fácil de usar. Este bench(function(){return 1/2;}, 10000, [], this) calculará 1/2 10.000 vezes.

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

É muito difícil escrever benchmarks cross-browser decentes. Simplesmente sincronismo um número pré-definido de iterações do seu código está href="http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/" não à prova de balas em tudo .

Como @broofa já foi sugerido, veja JSPerf . Ele usa Benchmark.js nos bastidores.

Se escrever um script de referência personalizado certifique-se notar que alguns navegadores aplicar manipulações dom apenas após a função em que são definidos terminou. Mais detalhes aqui http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

Se você precisar de algo simples que você pode fazer assim:

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

Aqui está um exemplo do código

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top