performance.now()
performance.now()
メソッドは、ミリ秒単位で計測された DOMHighResTimeStamp
を返します。
注: この機能は Web Worker 内で利用可能です
返値は時刻原点からの経過時間を表します。
次の点に留意してください。
Window
コンテキストから生成された専用ワーカー (dedicated worker) では、この値は生成元の window におけるperformance.now()
の値よりも小さい値になります。従来はメインコンテキストのt0
と同じでしたが、変更されました。- 共有ワーカー (shared worker) またはサービスワーカー (service worker) では、この値はメインコンテキストでの値よりも大きくなるかもしれません。 window はワーカーよりも後に生成される可能性があるからです。
ブラウザーは通常、 Spectre のような潜在的なセキュリティ脅威を軽減するために、予測可能性を低下させる目的で、返される値をある量で丸めることを覚えておくことが重要です。これは、タイマーの解像度や精度を制限することで、意図的にある程度不正確にします。例えば、 Firefox は返される時刻を 1 ミリ秒単位で丸めます。
返される値の精度は、セキュリティ上の懸念が他の手段で軽減された場合、またはされた場合に変更される可能性があります。
構文
js
t = performance.now();
例
js
const t0 = performance.now();
doSomething();
const 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
の設定が既定で有効になっており、既定で 1 ミリ秒となっています。
js
// Firefox 60 での時間精度の引き下げ (1ms)
performance.now();
// 8781416
// 8781815
// 8782206
// ...
// `privacy.resistFingerprinting` 有効化による時間精度の引き下げ`
performance.now();
// 8865400
// 8866200
// 8866700
// ...
Firefox では privacy.resistFingerprinting
も有効にすることができます。これは、精度を 100 ミリ秒または privacy.resistFingerprinting.reduceTimerPrecision.microseconds
のどちらか大きい方へ変更します。
Firefox 79 以降では、高精度タイマーは文書が Cross-Origin-Opener-Policy
および Cross-Origin-Embedder-Policy
ヘッダーを使用してクロスオリジン分離を行っている場合に使用することができるようになりました。
Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp
これらのヘッダーは、最上位の文書がクロスオリジン文書と閲覧コンテキストグループを共有しないことを保証します。 COOP プロセスは、文書を分離し、潜在的な攻撃者がポップアップでそれを開いていたとしても、グローバルオブジェクトにアクセスできないようにし、 XS-Leaks と呼ばれる一連のクロスオリジン攻撃を防止しています。
仕様
Specification |
---|
High Resolution Time # dom-performance-now |
仕様書
Specification |
---|
High Resolution Time # dom-performance-now |
ブラウザーの互換性
BCD tables only load in the browser
関連情報
- When milliseconds are not enough: performance.now() (HTML5 Rocks)