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 Date
objeto 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 Date
andt Date.now()
são. A exceção é que, Date
e os now()
tempos não se misturam, com Date
base 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).