Wenn Millisekunden nicht genügen – performance.now

Paul Irish

Der Timer mit hoher Auflösung wurde von der WebPerf-Arbeitsgruppe hinzugefügt, um präzisere Messungen auf der Webplattform zu ermöglichen als mit +new Date und dem neueren Date.now().

Hier sind nur zum Vergleich die Arten von Werten, die Sie zurückgeben würden:

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

Sie werden feststellen, dass die beiden obigen Werte um viele Größenordnungen unterschiedlich sind. performance.now() gibt den Gleitkommawert in Millisekunden seit Beginn des Ladevorgangs der Seite an (um spezifisch den performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart)-Zeitstempel zu machen). Man könnte argumentieren, dass es die Anzahl von Millisekunden seit der Unixzeit gewesen sein könnte, aber eine Web-App benötigt selten die Entfernung zwischen heute und 1970. Diese Zahl bleibt relativ zur Seite, da zwei oder mehr Messwerte miteinander verglichen werden.

Monoton

Ein weiterer Vorteil ist, dass Sie sich darauf verlassen können, dass die Zeit monoton ist. Lassen Sie uns den WebKit-Entwickler Tony Gentilcore dieses Beispiel erklären:

Anwendungsbereiche

Es gibt einige Situationen, in denen Sie diesen hochauflösenden Timer anstelle eines einfachen Zeitstempels verwenden würden:

  • Benchmarking
  • Runloop-Code für Spiel oder Animation
  • präzise Berechnung der Framerate
  • Cue-Aktionen oder Audioinhalte an bestimmten Stellen in einer Animation oder einer anderen zeitbasierten Sequenz

Verfügbarkeit

Der Timer mit hoher Auflösung ist derzeit in Chrome (stabile) als window.performance.webkitNow() verfügbar. Dieser Wert entspricht in der Regel dem neuen Argumentwert, der an den requestAnimationFrame-Callback übergeben wird. Das Präfix wird bald von WebKit gelöscht. Es ist dann über performance.now() verfügbar. Insbesondere die WebPerfWG unter der Leitung von Jatinder Mann von Microsoft war sehr erfolgreich bei der schnellen Bereitstellung von Präfixen für ihre Funktionen.

Zusammenfassend lässt sich sagen, dass performance.now()...

  • ein Double mit Mikrosekunden im Bruch
  • relativ zum navigationStart der Seite und nicht zur UNIX-Epoche
  • werden nicht verzerrt, wenn sich die Systemzeit ändert.
  • verfügbar in Chrome (stabile Chrome), Firefox 15+ und Internet Explorer 10.