Quando i millisecondi non sono sufficienti, performance.now

Il timer ad alta risoluzione è stato aggiunto dal gruppo di lavoro WebPerf per consentire una misurazione nella piattaforma web più precisa di quella che avevamo con +new Date e il più recente Date.now().

Per fare un confronto, ecco i tipi di valori che otterresti:

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

Noterai che i due valori riportati sopra sono diversi di molti ordini di grandezza. performance.now() è una misura in millisecondi con virgola mobile dal momento in cui è iniziato il caricamento della pagina specifica (in particolare, il timestamp performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart)). Potresti sostenere che potrebbe essere il numero di millisecondi dall'epoca Unix, ma raramente un'app web ha bisogno di conoscere la distanza tra il momento attuale e il 1970. Questo numero rimane relativo alla pagina perché dovrai confrontare due o più misurazioni tra loro.

Tempo monotono

Un altro vantaggio è che puoi fare affidamento sul fatto che il tempo sia monotono. Lasciamo che sia Tony Gentilcore, ingegnere di WebKit, a spiegarcelo:

Casi d'uso

Esistono alcune situazioni in cui è consigliabile utilizzare questo timer ad alta risoluzione anziché acquisire un timestamp di base:

  • benchmarking
  • codice del ciclo di lavoro di un gioco o di un'animazione
  • Calcolo della frequenza fotogrammi con precisione
  • cueing di azioni o audio in punti specifici di un'animazione o di un'altra sequenza basata sul tempo

Disponibilità

Il timer ad alta risoluzione è attualmente disponibile in Chrome (versione stabile) come window.performance.webkitNow() e questo valore è generalmente uguale al nuovo valore dell'argomento passato al callback requestAnimationFrame. A breve, WebKit non avrà più il prefisso e sarà disponibile tramite performance.now(). In particolare, il WebPerfWG, guidato da Jatinder Mann di Microsoft, ha risolto molto rapidamente il problema del prefisso delle funzionalità.

In sintesi, performance.now() è…

  • un doppio con microsecondi nella parte frazionaria
  • rispetto al navigationStart della pagina anziché all'epoca UNIX
  • non sono distorte quando cambia l'ora di sistema
  • disponibile in Chrome stabile, Firefox 15 e versioni successive ed IE10.