performance.now()
- Entrada
- performance.now()
- Saída esperada
- milissegundos com casas decimais, desde a abertura da página
O valor sempre cresce, chamada após chamada, mesmo que o relógio do sistema operacional seja ajustado no meio da medição.
cronômetro performance api
Este cronômetro não lê a hora do relógio do sistema para medir duração: ele usa performance.now(), uma API do navegador feita especificamente para medir intervalos de tempo com uma garantia que Date.now() não oferece, a de nunca andar para trás.
O valor sempre cresce, chamada após chamada, mesmo que o relógio do sistema operacional seja ajustado no meio da medição.
Serve para saber a hora atual, não para medir duração: um ajuste de relógio no meio da contagem pode fazer o resultado sair negativo.
O cronômetro só mostra a casa decimal de milissegundo se a resolução medida for de 1ms ou menos; senão, cai para centésimo ou segundo.
A duração continua correta porque é sempre recalculada pela diferença entre duas leituras do relógio monotônico, e não pela soma de ticks. O que pode ficar mais lento é o desenho na tela, já que navegadores reduzem o agendamento de quadros em abas ocultas. Ao voltar para a aba, o número exibido salta direto para o valor certo.
Não é errado para saber a hora atual, mas é arriscado para medir duração: o relógio do sistema pode ser ajustado por sincronização de rede ou pelo usuário durante a medição, e se ele andar para trás, a diferença calculada entre início e fim pode sair negativa. performance.now() evita esse problema porque é monotônico por definição.
Porque desde 2018 os navegadores reduzem deliberadamente a resolução de performance.now() como defesa contra ataques de canal lateral (a família Spectre), e o quanto cada navegador reduz não é igual; por isso o cronômetro mede a resolução real na hora, em vez de supor uma precisão fixa.
Porque ele está amarrado ao redesenho da tela, normalmente por volta de 60 vezes por segundo, e dispara quando o navegador decide redesenhar, não em intervalos de tempo garantidos; usar isso como base de tempo acumula erro a cada quadro perdido ou atrasado.
Ele mede a menor diferença detectável entre leituras seguidas do relógio: se essa resolução for de 1 milissegundo ou menos, mostra milissegundo; até 10 milissegundos, mostra centésimo; acima disso, cai para segundo inteiro, para nunca exibir uma precisão que o navegador não sustenta de verdade.
Tempos, voltas e sessões ficam apenas no armazenamento local deste navegador e nunca são enviados para um servidor.