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?
19 answers
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.
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')
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!
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;
Tenta jsPerf . É uma ferramenta de desempenho em javascript online para benchmarking e comparação de trechos de código. Estou sempre a usá-lo.
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
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
Resultado do desempenho IE
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.
Acho que o teste de desempenho JavaScript (tempo) é suficiente. Encontrei um artigo muito útil sobre o teste de desempenho JavaScript aqui .
Isto dava-te jeito: http://getfirebug.com/js.html tem um perfil para JavaScript.
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");
}
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
Podes usar a consola .perfil {[3] } em firebug
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.
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).
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);
/*
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