WebPerf Working Group が High Resolution Timer を追加し、ウェブ プラットフォームでの測定を +new Date
や新しい Date.now()
よりも正確に行えるようにしました。
比較のために、次のような値が返されるようにします。
Date.now() // 1337376068250
performance.now() // 20303.427000007
上記の 2 つの値は、桁違いに大きく異なることがわかります。performance.now()
は、特定のページの読み込みが開始されてからの浮動小数点数ミリ秒で表した値です(具体的なのは performance.timing.[navigationStart](https://www.w3.org/TR/navigation-timing/#dom-performancetiming-navigationstart)
のタイムスタンプ)。ユニックス エポックからのミリ秒数であったとしても、ウェブアプリが現在から 1970 年までの距離を知る必要がないことは滅多にありません。2 つ以上の測定値を互いに比較するため、この数値はページに対する相対値になります。
単調時間
ここでのもう 1 つのメリットは、時刻を単調にできることです。WebKit のエンジニア Tony Gentilcore がこれについて説明してもらいましょう。
ユースケース
次のような状況では、基本的なタイムスタンプを取得する代わりに、この高解像度タイマーを使用します。
- ベンチマーク
- ゲームまたはアニメーションのランループ コード
- 精度の高いフレームレートの計算
- アニメーションやその他の時間ベースのシーケンス内の特定のポイントでアクションや音声が行われるようにキューイングする
対象
現在、高解像度タイマーは Chrome(安定版)で window.performance.webkitNow()
として利用できます。この値は通常、requestAnimationFrame コールバックに渡される新しい引数値と同等です。間もなく、WebKit のプレフィックスは廃止され、performance.now()
を通じて使用できるようになります。特に、Microsoft の Jatinder Mann が率いる WebPerfWG は、すぐに機能のプレフィックス解除に成功しています.
まとめると、performance.now()
は...
- 小数点以下がマイクロ秒である double 型の
- UNIX エポックではなく、ページの
navigationStart
が基準になります。 - システム時刻が変化しても偏りがない
- Chrome Stable 版、Firefox 15 以降、IE10 で利用できます。