Quando os milissegundos não são suficientes: performance.now

O Timer de alta resolução foi adicionado pelo Grupo de trabalho WebPerf (link em inglês) para permitir medições na plataforma Web mais precisas do que as realizadas com o +new Date e o Date.now() mais recente.

Só para comparar, aqui estão os tipos de valores que você receberia:

Date.now()         //  1337376068250
performance.now()  //  20303.427000007

Você notará que os dois valores acima têm muitas ordens de magnitude diferentes. performance.now() é uma medida de milissegundos de ponto flutuante desde que determinada página começou a carregar (o carimbo de data/hora performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) para ser específico). Você poderia argumentar que esse pode ser o número de milissegundos desde o época do unix, mas raramente um app da Web precisa saber a distância entre agora e 1970. Esse número permanece relativo à página porque você estará comparando duas ou mais medições.

Horário monotônico

Outro benefício disso é que o tempo é monotônico. Vamos deixar o engenheiro do WebKit, Tony Gentilcore, explicar isso:

Casos de uso

Existem algumas situações em que você usaria esse timer de alta resolução em vez de capturar um carimbo de data/hora básico:

  • comparativo de mercado
  • código de loop de execução de jogo ou animação
  • calcular frame rate com precisão
  • que ações ou áudios sejam acionados em pontos específicos de uma animação ou outra sequência de tempo

Disponibilidade

O timer de alta resolução está disponível no Chrome (Stable) como window.performance.webkitNow(), e esse valor geralmente é igual ao novo valor do argumento transmitido ao callback do requestAnimationFrame. Em breve, o WebKit vai remover o prefixo, que estará disponível pelo performance.now(). Em particular, o WebPerfWG, liderado por Jatinder Mann, da Microsoft, teve muito sucesso ao remover a prefixo dos recursos rapidamente.

Resumindo, performance.now() é...

  • um duplo com microssegundos na fórmula
  • relativo ao navigationStart da página e não à época do UNIX
  • não distorcidas quando o horário do sistema mudar
  • disponível no Chrome Stable, Firefox 15+ e IE10.