Como você testa o código de JavaScript?

ciclos de CPU, Utilização da Memória, tempo de execução, etc.?

adiciona: existe uma maneira quantitativa de testar o desempenho em JavaScript além da percepção de quão rápido o código corre?

Author: Peter Mortensen, 2008-09-21

19 answers

[[4]] perfis são definitivamente uma boa maneira de obter números, mas na minha experiência, desempenho percebido é tudo o que importa para o usuário/cliente. Por exemplo, tivemos um projeto com um acordeão Ext que se expandiu para mostrar alguns dados e, em seguida, algumas grades EXT aninhadas. Tudo estava realmente renderizando muito rápido, nenhuma única operação levou muito tempo, havia apenas um monte de informações sendo renderizadas de uma vez, então ele se sentiu lento para o usuário. [4]nós 'consertamos' isso, não mudando para um componente mais rápido, ou otimizando algum método, mas rendendo os dados primeiro, em seguida, rendendo as grades com um setTimeout. Então, a informação apareceu primeiro, então as grades apareciam um segundo mais tarde. No geral, levou um pouco mais de tempo de processamento para fazê-lo dessa forma, mas para o usuário, o desempenho percebido foi melhorado.

Editar: esta resposta tem agora 7 anos. Hoje em dia, o perfil do Chrome e outras ferramentas estão universalmente disponíveis e fáceis de usar, como são console.time(), console.profile(), e performance.now(). O Chrome também lhe dá uma visão temporal que lhe pode mostrar o que está a matar a sua taxa de imagens, onde o utilizador pode estar à espera, etc.

Encontrar documentação para todas estas ferramentas é realmente fácil, você não precisa de uma resposta para isso. 7 anos depois, eu ainda vou repetir o Conselho da minha resposta original e apontar que você pode ter um código lento executar para sempre onde um usuário não vai notar, e um código muito rápido executando onde eles fazem, e eles vai reclamar sobre o código bastante rápido não ser rápido o suficiente. Ou que o seu pedido para a sua API do servidor levou 220ms ou algo do género. O ponto permanece que se você pegar um profiler para fora e ir à procura de trabalho para fazer, você vai encontrá-lo, mas pode não ser o trabalho que seus usuários precisam.
 274
Author: noah, 2016-06-13 09:46:25
Concordo que o desempenho percebido é realmente tudo o que importa. Mas às vezes eu só quero descobrir que método de fazer algo é mais rápido. Às vezes a diferença é enorme e vale a pena saber. Podes usar os temporizadores javascript. Mas eu tipicamente obtenho resultados muito mais consistentes usando o nativo Chrome (agora também em Firefox e Safari) métodos devTool console.time() & console.timeEnd()

Exemplo de como o uso:

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

Results Look like this

Actualizar (4/4/2016):

O Chrome canary adicionou recentemente perfil de Nível de linha {[17] } a página de fontes de ferramentas do dev, que vamos ver exactamente quanto tempo cada linha demorou a executar! enter image description here

 155
Author: Jose Browne, 2016-04-05 01:16:21

Podemos sempre medir o tempo tomado por qualquer função pelo objecto de data simples.

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;
 89
Author: pramodc84, 2015-03-28 18:09:05

Tenta jsPerf . É uma ferramenta de desempenho em javascript online para benchmarking e comparação de trechos de código. Estou sempre a usá-lo.

 53
Author: Relax, 2011-02-11 16:25:43

A maioria dos navegadores está agora a implementar um calendário de alta resolução em performance.now(). É superior a {[[2]} para testes de desempenho porque funciona independentemente do relógio do sistema.

Utilização

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

Referências

 31
Author: Daniel Imms, 2014-11-25 17:48:55

O JSLitmus é uma ferramenta leve para criar testes de benchmark JavaScript ad-hoc

Vamos examinar o desempenho entre function expression e function constructor:

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() { 
    return new Function("for(var i=0; i<100; i++) {}"); 
});

JSLitmus.test("function() ...", function() { 
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

O que eu fiz acima foi criar uma function expression e function constructor executando a mesma operação. O resultado é o seguinte:

Resultado Do Desempenho Do FireFox

FireFox Performance Result

Resultado do desempenho IE

IE Performance Result

 29
Author: Ramiz Uddin, 2012-08-03 03:29:53
Algumas pessoas sugerem plug-ins e/ou navegadores específicos. Eu não faria isso porque eles são apenas realmente útil para aquela plataforma; uma corrida de teste no Firefox não vai traduzir com precisão para IE7. Considerando 99.999999% dos sites têm mais de um navegador visitá-los, você precisa verificar o desempenho em todas as plataformas populares. A minha sugestão seria manter isto no JS. Crie uma página de benchmarking com todos os seus testes JS e cronometre a execução. Podias ... até tem AJAX-postar os resultados de volta para você para mantê-lo totalmente automatizado. Depois enxaguar e repetir em diferentes plataformas.
 15
Author: Oli, 2008-09-21 16:57:00

Tenho uma pequena ferramenta onde posso executar rapidamente pequenos testes no navegador e obter imediatamente os resultados:

Teste De Velocidade JavaScript

Você pode jogar com o código e descobrir que técnica é melhor no navegador testado.

 9
Author: DUzun, 2018-03-19 05:36:59

Acho que o teste de desempenho JavaScript (tempo) é suficiente. Encontrei um artigo muito útil sobre o teste de desempenho JavaScript aqui .

 7
Author: jQuery Lover, 2009-12-10 21:21:54
 6
Author: John Boker, 2009-12-10 21:22:50

Aqui está uma função simples que mostra o tempo de execução de uma função passada:

var perf = function(testName, fn) {
    var startTime = new Date().getTime();
    fn();
    var endTime = new Date().getTime();
    console.log(testName + ": " + (endTime - startTime) + "ms");
}
 5
Author: Bunz, 2018-03-18 00:37:12
Acho que o tempo de execução é a melhor medida.
 3
Author: pdavis, 2008-09-21 16:38:50

Resposta Rápida

Em jQuery( mais especificamente em Sizzle), usamos Este (checkout master e Open speed/index.html no seu navegador), que por sua vez usa benchmark.js . Isto é usado para testar o desempenho da biblioteca.

Resposta longa

Se o leitor não sabe a diferença entre benchmark, carga de trabalho e profilers, leia primeiro algumas bases de testes de desempenho na secção"readme 1st" do spec.org isto é ... para testes de sistema, mas compreender estas fundações irá ajudar JS perf teste também. Alguns destaques:

o que é uma referência?

Um parâmetro de referência é "um padrão de medição ou avaliação" (Dicionário Webster II). Um benchmark de computador é tipicamente um programa de computador que executa um conjunto estritamente definido de operações - uma carga de trabalho - e retorna alguma forma de resultado - uma métrica - descrevendo como o computador testado realizou. Métricas de referência computacional normalmente, medir a velocidade: a rapidez com que a carga de trabalho foi concluída; ou a capacidade: quantas unidades de carga de trabalho por unidade de tempo foram concluídas. Executar o mesmo referencial de computador em vários computadores permite uma comparação a ser feita.

devo avaliar a minha própria aplicação?

Idealmente, o melhor teste de comparação para sistemas seria a sua própria aplicação com a sua própria carga de trabalho. Infelizmente, é muitas vezes impraticável obter uma ampla base de confiança, repetível e comparável medições para diferentes sistemas usando sua própria aplicação com sua própria carga de trabalho. Os problemas podem incluir a geração de um bom caso de teste, preocupações de confidencialidade, dificuldade em garantir condições comparáveis, tempo, dinheiro ou outras restrições.

Se não for a minha candidatura, o que acontece?

Talvez queira considerar a utilização de Parâmetros de referência normalizados como ponto de referência. Idealmente, uma referência padronizada será portátil, e pode já ter sido executado no plataformas que você está interessado. No entanto, antes de considerar os resultados você precisa ter certeza de que você entende a correlação entre suas necessidades de Aplicação/computação e o que a referência está medindo. Os benchmarks são semelhantes aos tipos de aplicações que você executa? As cargas de trabalho têm características semelhantes? Com base nas suas respostas a estas perguntas, você pode começar a ver como a referência pode aproximar a sua realidade.

Nota: Um parâmetro de referência normalizado pode servir de base para: referência. No entanto, quando você está fazendo seleção de fornecedores ou produtos, SPEC não afirma que qualquer referência padronizada pode substituir benchmarking sua própria aplicação real.

Ensaio de desempenho JS

Idealmente, o melhor teste perf seria usar a sua própria aplicação com a sua própria carga de trabalho mudando o que você precisa testar: diferentes bibliotecas, máquinas, etc.

Se isto não for viável (e normalmente não é). O primeiro passo importante: definir a tua carga de trabalho. Deve reflectir a carga de trabalho da sua candidatura. Nesta conversa, Vyacheslav Egorov fala de cargas de trabalho merdosas que devias evitar.

Então, você poderia usar ferramentas como benchmark.js para ajudá-lo a coletar métricas, geralmente velocidade ou rendimento. No Sizzle, estamos interessados em comparar como correções ou mudanças afetam o desempenho sistêmico da biblioteca.

Se algo está muito mal, o próximo passo é procurar estrangulamentos.

Como faço encontrar estrangulamentos? Perfis

Qual é a melhor maneira de analisar a execução javascript?

 3
Author: Rafael Xavier, 2017-05-23 11:47:22

Podes usar a consola .perfil {[3] } em firebug

 2
Author: Willem de Wit, 2012-09-04 11:21:57
Normalmente testo apenas o desempenho de javascript, a duração do script. jQuery Lover deu um bom link de artigo para testes desempenho de código javascript, mas o artigo só mostra como testar quanto tempo o seu código javascript corre. Eu também recomendaria ler um artigo chamado "5 dicas sobre melhorar o seu código jQuery enquanto trabalha com enormes conjuntos de dados".
 1
Author: Uzbekjon, 2009-05-20 06:54:27

O UX Profiler aborda este problema da perspectiva do utilizador. Ele agrupa todos os Eventos do navegador, atividade de rede, etc, causados por alguma ação do usuário (clique) e leva em consideração todos os aspectos como latência, timeouts, etc.

 1
Author: Konstantin Triger, 2015-06-12 08:41:10

A regra de ouro é não bloquear, em circunstância alguma, o seu navegador de utilizadores. Depois disso, eu geralmente olho para o tempo de execução, seguido pelo uso da memória (a menos que você está fazendo algo louco, em que caso pode ser uma prioridade maior).

 0
Author: William Keller, 2008-09-21 16:38:36
Esta é uma boa maneira de recolher informações de desempenho para a operação específica.
start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
 0
Author: user2601995, 2013-10-09 00:33:41
Aqui está uma aula reutilizável para o desempenho do tempo. O exemplo está incluído no código:
/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output
 0
Author: Shawn Dotey, 2016-01-12 20:24:25