Preciso obter tempo de execução em milissegundos.
Eu originalmente fiz essa pergunta em 2008. A resposta aceita era usar o novo Date (). GetTime () No entanto, todos podemos concordar agora que o uso da API performance.now () padrão é mais apropriado. Portanto, estou mudando a resposta aceita para esta.
javascript
profiling
Júlio A
fonte
fonte
Date
maneira clássica , o que lhe dáms
e é suficiente para a maioria dos casos, eu acho albertech.blogspot.com/2015/07/… ... mas sim, você realmente deve olharPerformance.now
performance.now()
não funciona no nónew Date().getTime()
funcionará no nó.Respostas:
Usando performance.now () :
Usando console.time :
(não padrão)( padrão de vida )Nota :
A sequência que está sendo passada para osmétodos
time()
etimeEnd()
deve corresponder(para que o cronômetro termine conforme o esperado).
fonte
use new Date (). getTime ()
ex.
fonte
window.performance.now
. Veja stackoverflow.com/a/15641427/632951Não use Date (). Leia abaixo.
Use
performance.now()
:Funciona em:
IE 10 ++
FireFox 15 ++
Chrome 24 ++
Safari 8 ++
Opera 15 ++
Android 4.4 ++
etc etc
console.time
pode ser viável para você , mas é não-padrão § :Além do suporte ao navegador,
performance.now
parece ter o potencial de fornecer intervalos mais precisos, pois parece ser a versão básica doconsole.time
.<rant> Além disso, NUNCA use
Date
para nada porque é afetado por alterações na "hora do sistema". O que significa que irá obter resultados inválidos -como "sincronismo negativo" - quando o usuário não tem um tempo de sistema preciso:(Defina o relógio do sistema para um ano atrás e vá para o Gmail para que todos possamos dar boas risadas. Talvez um dia tenhamos um Hall of Shame for JS
Date
.)A
now()
função da planilha do Google também sofre com esse problema.A única vez que você usará será
Date
quando quiser mostrar ao usuário a hora do relógio do sistema. Não quando você deseja obter o tempo ou a medida nada.fonte
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()
econsole.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:
Como alternativa, na sua máquina de desenvolvimento , você pode adicionar instrumentação ao seu código com
console.time()
econsole.timeEnd()
. Essas funções, suportadas no Firefox11 +, Chrome2 + e IE11 +, relatam os temporizadores pelos quais você inicia / paraconsole.time()
.time()
usa um nome de timer definido pelo usuário como argumento e, emtimeEnd()
seguida, relata o tempo de execução desde o início do timer: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 detimeEnd()
é 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()
: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 tradicionalDate.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 porqueDate.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), elaDate.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 quenew Date().getTime()
,+ new Date
andtDate.now()
são. A exceção é que,Date
e osnow()
tempos não se misturam, comDate
base na época unix (o número de milissegundos desde 1970), enquantonow()
é o número de milissegundos desde que a navegação da página foi iniciada (portanto, será muito menor queDate
).Aqui está um exemplo de como usar
now()
: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()
econsole.timeEnd()
, mas utiliza a mesma alta resolução Timestamp quenow()
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 ligarmeasure(measurename, startMarkname)
. A duração é salva no PerformanceTimeline ao lado de suas marcas.O UserTiming está disponível no IE10 + e Chrome25 +. Há também um polyfill disponível (que eu escrevi).
fonte
performance.now
eDate
é a razão de existir.Para obter valores precisos, você deve usar a interface Performance . É suportado em versões modernas do Firefox, Chrome, Opera e IE. Aqui está um exemplo de como ele pode ser usado:
Date.getTime()
ouconsole.time()
não são bons para medir o tempo de execução preciso. Você pode usá-los se a estimativa aproximada rápida for boa para você. Por estimativa aproximada, quero dizer que você pode obter uma troca de 15 a 60 ms em tempo real.Confira este post brilhante sobre como medir o tempo de execução em JavaScript. O autor também fornece alguns links sobre a precisão do tempo do JavaScript, vale a pena ler.
fonte
Use o Firebug, ative o Console e o Javascript. Clique em perfil. Recarregar. Clique em perfil novamente. Veja o relatório.
fonte
console.time()
econsole.timeEnd()
demais.Referência
Resultado
performance.now () é opcional - basta passar false para a função do construtor StopWatch.
fonte
process.hrtime () está disponível no Node.js - retorna um valor em nanossegundos
fonte
hrtime[0] * 1000 + hrtime[1] / 1000000
-> sim, prefiro usá-lovar hrtime
também! : Pvocê pode usar adicionar operador também aqui
fonte
Para estender o código do vsync para ter a capacidade de retornar o timeEnd como um valor no NodeJS, use este pequeno pedaço de código.
Agora use o código da seguinte maneira:
Isso lhe dá mais possibilidades. Você pode armazenar o tempo de execução a ser usado para mais propósitos, como usá-lo em equações ou armazenado em um banco de dados, enviado a um cliente remoto por websockets, servido em uma página da web etc.
fonte
É possível usar apenas uma variável:
timer/1000
- converter milissegundos em segundos.toFixed(5)
- para cortar dígitos extrasfonte
Desde
console.time
eperformance.now
não é suportado em alguns navegadores principais (ie IE10), criei um utilitário fino que utiliza os melhores métodos disponíveis. No entanto, falta tratamento de erros para usos falsos (chamarEnd()
um timer não inicializado).Use-o e melhore-o como quiser.
fonte
Isso pode ajudá-lo.
var t0 = date.now(); doSomething(); var t1 = date.now(); console.log("Call to doSomething took approximate" + (t1 - t0)/1000 + " seconds.")
fonte
Aqui está um decorador para funções de temporização
Uso:
Se você estiver usando funções assíncronas, você pode fazer
timed
async e adicionar umawait
antes de f (... args), e isso deve funcionar para eles. Fica mais complicado se você deseja que um decorador lide com as funções de sincronização e assíncrona.fonte
Obrigado, Achim Koellner, expandirá sua resposta um pouco:
Observe que você não deve fazer nada além do que deseja medir (por exemplo,
console.log
também levará tempo para executar e afetará os testes de desempenho).Observe que, para medir o tempo de execução das funções assíncronas, você deve inserir
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;
dentro do retorno de chamada. Por exemplo,fonte
Alguns meses atrás, montei minha própria rotina que cronometra uma função usando Date.now () - embora na época o método aceito parecesse performance.now () - porque o objeto de desempenho ainda não estava disponível (construído -in) na versão estável do Node.js.
Hoje eu estava pesquisando um pouco mais e encontrei outro método para cronometrar. Como também descobri como usar isso no código Node.js., pensei em compartilhá-lo aqui.
O seguinte é combinado a partir dos exemplos fornecidos pelo w3c e pelo Node.js :
NOTA:
Se você pretende usar o
performance
objeto em um aplicativo Node.js., você deve incluir o seguinte requisito:const { performance } = require('perf_hooks')
fonte
performance.mark('end')
, neste casoexistem várias maneiras de atingir esse objetivo:
usando console.time
esta é a maneira mais eficiente: usar performance.now () , por exemplo
use + (adicionar operador) ou getTime ()
Aqui está o que acontece quando você aplica o operador unary plus a uma instância de Data: Obtenha o valor da instância de Data em questão Converta-o em um Número
NOTA:
getTime()
oferece melhor desempenho que o operador unário +.fonte
InitTime relacionado a
string
.return Singleton.getInstance().initTime(label); // Returns the time init
return Singleton.getInstance().endTime(label); // Returns the total time between init and end
fonte
Se você deseja medir o tempo entre várias coisas que não estão aninhadas, use:
É semelhante ao console.time (), mas é mais fácil de usar se você não precisar acompanhar os cronômetros anteriores.
Se você gosta da cor azul de console.time (), pode usar esta linha
fonte
No meu caso, eu prefiro usar @ grammar suger e compilá-lo com babel.
O problema desse método é que a função precisa estar dentro do objeto.
Código JS de amostra
.babelrc (para babel 6)
fonte
Cronômetro com ciclos cumulativos
Funciona com servidor e cliente (Nó ou DOM), usa o
Performance
API. Bom quando você tem muitos ciclos pequenos, por exemplo, em uma função chamada 1000 vezes que processa 1000 objetos de dados, mas você deseja ver como cada operação nesta função se soma ao total.Portanto, este usa um temporizador global (singleton) do módulo. O mesmo que um padrão de classe singleton, apenas um pouco mais simples de usar, mas você precisa colocá-lo em um
stopwatch.js
arquivo, por exemplo, separado .fonte
A melhor maneira seria usar o
performance hooks
módulo. Embora instável, você podemark
áreas específicas do seu código emeasure
asduration
áreas marcadas.Experimente aqui
fonte
fonte
Com desempenho
NodeJs: é necessário importar a classe de desempenho
Usando console.time
fonte
console.time("myTimer");
console.timeLog("myTimer");
console.timeEnd("myTimer");
Você pode ler mais sobre isso em MDN e na documentação Node.js .
Disponível no Chrome, Firefox, Opera e NodeJS. (não no Edge ou no Internet Explorer).
fonte
Conforme indicado anteriormente, verifique e use o temporizador incorporado. Mas se você quiser ou precisar escrever seu próprio, aqui estão meus dois centavos:
A compilação foi um sucesso!
fonte
A resposta aceita está errada !
Como o JavaScript é assíncrono, os valores da variável final da resposta aceita estarão incorretos.
A execução do for pode ser muito rápida, portanto você não pode ver que o resultado está errado. Você pode testá-lo com um código fazendo uma solicitação:
Portanto, o alerta será solicitado rapidamente, mas no console você verá que as solicitações do ajax continuam.
Aqui está como você deve fazê-lo: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now
fonte