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

O timer de alta resolução foi adicionado pelo WebPerf Working Group para permitir medições na plataforma da Web mais precisas do que as que tínhamos com +new Date e o Date.now() mais recente.

Para comparar, confira os tipos de valores que você vai receber:

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

Os dois valores acima são muito diferentes. performance.now() é uma medição de milissegundos de ponto flutuante desde que a página começou a ser carregada (o carimbo de data/hora performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) para ser específico). Poderia ser o número de milissegundos desde a Era Unix, mas raramente um app da Web precisa saber a distância entre o presente e 1970. Esse número permanece relativo à página porque você vai comparar duas ou mais medições entre si.

Tempo monótono

Outro benefício adicional é que você pode confiar que o tempo é monótono. Vamos deixar o engenheiro do WebKit Tony Gentilcore explicar isso:

Casos de uso

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

  • comparativo de mercado
  • código de runloop de jogo ou animação
  • calcular a taxa de quadros com precisão
  • definir ações ou áudios para ocorrer em pontos específicos de uma animação ou outra sequência baseada em 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 para o callback requestAnimationFrame. Em breve, o WebKit vai remover o prefixo, e ele vai estar disponível em performance.now(). O WebPerfWG, em particular, liderado por Jatinder Mann da Microsoft, teve muito sucesso em remover o prefixo dos recursos rapidamente.

Em resumo, performance.now() é...

  • um número duplo com microssegundos no fracionário
  • em relação ao navigationStart da página, e não à época UNIX
  • não são distorcidas quando a hora do sistema muda
  • disponível no Chrome estável, Firefox 15+ e IE10.