Se você precisar obter tempo de execução da função em sua máquina de desenvolvimento local , poderá usar as ferramentas de criação de perfil do navegador ou comandos do console como console.time()e console.timeEnd().
Todos os navegadores modernos têm perfis de JavaScript incorporados. Esses criadores de perfil devem fornecer as medidas mais precisas, pois você não precisa modificar o código existente, o que pode afetar o tempo de execução da função.
Para criar um perfil do seu JavaScript:
- No Chrome , pressione F12 e selecione a guia Perfis e , em seguida, Coletar perfil de CPU JavaScript .
- No Firefox , instale / abra o Firebug e clique no botão Perfil .
- No IE 9+ , pressione F12 , clique em Script ou Profiler (dependendo da sua versão do IE).
Como alternativa, na sua máquina de desenvolvimento , você pode adicionar instrumentação ao seu código com console.time()e console.timeEnd(). Essas funções, suportadas no Firefox11 +, Chrome2 + e IE11 +, relatam os temporizadores pelos quais você inicia / para console.time(). time()usa um nome de timer definido pelo usuário como argumento e, em timeEnd()seguida, relata o tempo de execução desde o início do timer:
function a() {
console.time("mytimer");
... do stuff ...
var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}
Observe que apenas o Firefox retorna o tempo decorrido na timeEnd()chamada. Os outros navegadores simplesmente informam o resultado ao console do desenvolvedor: o valor de retorno de timeEnd()é indefinido.
Se você deseja obter tempo de execução de funções em estado selvagem , precisará instrumentar seu código. Você tem algumas opções. Você pode simplesmente salvar os horários de início e término consultando new Date().getTime():
function a() {
var start = new Date().getTime();
... do stuff ...
var end = new Date().getTime();
var dur = end - start;
}
No entanto, o Dateobjeto tem apenas uma resolução de milissegundos e será afetado pelas alterações no relógio do sistema do sistema operacional. Nos navegadores modernos, há uma opção melhor.
A melhor opção é usar o tempo de alta resolução , também conhecido como window.performance.now(). now()é melhor que o tradicional Date.getTime()de duas maneiras importantes:
now()é um duplo com resolução de submilissegundo que representa o número de milissegundos desde o início da navegação da página. Retorna o número de microssegundos no fracionário (por exemplo, um valor de 1000.123 é 1 segundo e 123 microssegundos).
now()está aumentando monotonicamente. Isto é importante porque Date.getTime()pode possivelmente saltar para a frente ou mesmo para trás em chamadas subseqüentes. Notavelmente, se a hora do sistema do sistema operacional for atualizada (por exemplo, sincronização do relógio atômico), ela Date.getTime()também será atualizada. now()é garantido que sempre aumenta monotonicamente, portanto, não é afetado pela hora do sistema do sistema operacional - sempre será a hora do relógio de parede (supondo que seu relógio de parede não seja atômico ...).
now()pode ser usado em quase todos os lugares que new Date().getTime(), + new Dateandt Date.now()são. A exceção é que, Datee os now()tempos não se misturam, com Datebase na época unix (o número de milissegundos desde 1970), enquanto now()é o número de milissegundos desde que a navegação da página foi iniciada (portanto, será muito menor que Date).
Aqui está um exemplo de como usar now():
function a() {
var start = window.performance.now();
... do stuff ...
var end = window.performance.now();
var dur = end - start;
}
now()é suportado no Chrome estável, Firefox 15+ e IE10. Existem também vários polyfills disponíveis.
Uma outra opção para medir o tempo de execução no ambiente é o UserTiming . UserTiming se comporta de forma semelhante a console.time()e console.timeEnd(), mas utiliza a mesma alta resolução Timestamp que now()usos (de modo a obter um sub-milissegundo monótona crescente relógio), e salva os timestamps e durações à PerformanceTimeline .
UserTiming possui os conceitos de marcas (timestamps) e medidas (durações). Você pode definir quantos quiser e eles são expostos no PerformanceTimeline .
Para salvar um carimbo de data e hora, você liga mark(startMarkName). Para obter a duração desde a sua primeira marca, basta ligar measure(measurename, startMarkname). A duração é salva no PerformanceTimeline ao lado de suas marcas.
function a() {
window.performance.mark("start");
... do stuff ...
window.performance.measure("myfunctionduration", "start");
}
// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];
O UserTiming está disponível no IE10 + e Chrome25 +. Há também um polyfill disponível (que eu escrevi).