performance.now()

performance.now() メソッドは、ミリ秒単位で計測された DOMHighResTimeStamp を返します。

タイムスタンプは実際には高解像度ではありません。Spectre のようなセキュリティ上の脅威を軽減するために、ブラウザは現在、さまざまな程度まで結果を丸めています (Firefox は Firefox 59 から 2 ミリ秒に丸めています)。ブラウザによっては、タイムスタンプを少しランダム化するものもあります。 精度は将来のリリースで改善されることでしょう。ブラウザの開発者は、これらのタイミング攻撃と、それを軽減する最善策について調査しています。

註: この機能は Web Workers 内で利用可能です。

戻り値は、time origin からの経過時間を表します。

次の点に留意してください:

  • Window コンテキストから生成された Dedicated Worker (専用ワーカー) では、この値は生成元の window におけるperformance.now() の値よりも小さい値となるでしょう。従来はメインコンテキストの t0 と同じでしたが、これは変わりました。
  • Shared Worker または Service Worker では、この値はメインコンテキストでの値よりも大きくなるかもしれません。そのウィンドウは、それらワーカー以後に生成され得るためです。

構文

t = performance.now();

var t0 = performance.now();
doSomething();
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");

JavaScript で利用できる他のタイミングデータ (例えば Date.now) とは違い、 performance.now() が返すタイムスタンプは、1ミリ秒の分解能に制限されません。その代わりに、マイクロ秒までの精度を持った浮動小数点の値で表します。

また、Date.now() とは違い、performance.now() が返す値は、常に一定の割合で増加します。システムクロック (これはマニュアルで調整、またはNTPのようなソフトウェアで変えられているかもしれません) から独立しているのです。他方で performance.timing.navigationStart + performance.now() は、おおよそ Date.now() と同じになるでしょう。

時間精度の引き下げ

タイミング攻撃やフィンガープリンティングから保護するため、ブラウザの設定によっては、performance.now() の精度が丸められることがあります。
Firefoxでは、privacy.reduceTimerPrecision の設定がデフォルトで有効になっており、Firefox 59 ではデフォルトで 20 us (マイクロ秒) に設定されています。 Firefox 60 では 2 ms (ミリ秒) になります。

// Firefox 60 での時間精度の引き下げ (2ms)
performance.now();
// 8781416
// 8781814
// 8782206
// ...


// `privacy.resistFingerprinting` 有効化による時間精度の引き下げ`
performance.now();
// 8865400
// 8866200
// 8866700
// ...

Firefoxでは privacy.resistFingerprinting も有効にできます。これは、精度を 100 ms か privacy.resistFingerprinting.reduceTimerPrecision.microseconds のどちらか大きい方へ変更します。

仕様

仕様書 策定状況 コメント
High Resolution Time Level 2
performance.now() の定義
勧告候補 インターフェイスと型について、より厳密な定義
High Resolution Time
performance.now() の定義
勧告 初期定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイル
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung Internet
nowChrome 完全対応 24
完全対応 24
未対応 21 — 24
接頭辞付き
接頭辞付き webkit のベンダー接頭辞が必要
Edge 完全対応 12Firefox 完全対応 15
補足
完全対応 15
補足
補足 In Firefox 57.0.4 the accuracy was reduced to 20 microseconds.
補足 In Firefox 59 the accuracy was reduced to 2 milliseconds.
補足 In Firefox 60 the accuracy was increased to 1 millisecond.
IE 完全対応 10Opera 完全対応 15Safari 完全対応 8WebView Android 完全対応 ありChrome Android 完全対応 25Firefox Android 完全対応 15
補足
完全対応 15
補足
補足 In Firefox 57.0.4 the accuracy was reduced to 20 microseconds.
補足 In Firefox 59 the accuracy was reduced to 2 milliseconds.
補足 In Firefox 60 the accuracy was increased to 1 millisecond.
Opera Android 完全対応 14Safari iOS 完全対応 9Samsung Internet Android ?

凡例

完全対応  
完全対応
実装状況不明  
実装状況不明
実装ノートを参照してください。
実装ノートを参照してください。
使用するには、ベンダー接頭辞または異なる名前が必要です。
使用するには、ベンダー接頭辞または異なる名前が必要です。

関連情報