Quando i millisecondi non sono sufficienti, performance.now

Paul Irish

Il timer ad alta risoluzione è stato aggiunto dal WebPerf Working Group per consentire nella piattaforma web misurazioni più precise rispetto a quelle di +new Date e della versione più recente di Date.now().

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

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

Noterai che i due valori precedenti presentano molti ordini di grandezza diversi. performance.now() misura i millisecondi in virgola mobile da quando è iniziato il caricamento di quella pagina specifica (il timeStamp performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart) per essere specifici). Si potrebbe sostenere che sarebbe stato il numero di millisecondi dall'epoca di Unix, ma raramente un'app web ha bisogno di conoscere la distanza da adesso al 1970. Questo numero rimane relativo alla pagina perché confronterai due o più misurazioni.

Tempo monotonico

Un altro vantaggio aggiunto è che potete contare sul tempo monotonico. Lasciamo che l'ingegnere di WebKit Tony Gentilcore spieghi questa cosa:

Casi d'uso

Esistono alcune situazioni in cui potresti utilizzare questo timer ad alta risoluzione invece di ottenere un timestamp di base:

  • benchmarking
  • codice runloop di un gioco o di un'animazione
  • calcolare la frequenza fotogrammi con precisione
  • azioni di cueing o audio che si verifichino in punti specifici di un'animazione o di un'altra sequenza temporale

Disponibilità

Il timer ad alta risoluzione è attualmente disponibile in Chrome (stabile) come window.performance.webkitNow() e questo valore è in genere uguale al nuovo valore dell'argomento passato nel callback requestAnimationFrame. Presto WebKit eliminerà il prefisso e sarà disponibile fino al giorno performance.now(). Il WebPerfWG in particolare, guidato da Jatinder Mann di Microsoft, ha riscosso molto successo nel non prefissare le sue funzionalità in tempi abbastanza brevi.

Per riassumere, performance.now() è...

  • doppio con microsecondi nella frazione
  • rispetto al valore navigationStart della pagina anziché all'epoca di UNIX
  • non alterato quando cambia l'ora di sistema
  • disponibile nella versione stabile di Chrome, Firefox 15 e versioni successive e IE10.