performance.now()

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

注: この機能は Web Worker 内で利用可能です

返値は時刻原点からの経過時間を表します。

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

  • Window コンテキストから生成された専用ワーカー (dedicated worker) では、この値は生成元の window におけるperformance.now() の値よりも小さい値になります。従来はメインコンテキストの t0 と同じでしたが、変更されました。
  • 共有ワーカー (shared worker) またはサービスワーカー (service worker) では、この値はメインコンテキストでの値よりも大きくなるかもしれません。 window はワーカーよりも後に生成される可能性があるからです。

ブラウザーは通常、 Spectre のような潜在的なセキュリティ脅威を軽減するために、予測可能性を低下させる目的で、返される値をある量で丸めることを覚えておくことが重要です。これは、タイマーの解像度や精度を制限することで、意図的にある程度不正確にします。例えば、 Firefox は返される時刻を 1 ミリ秒単位で丸めます。

返される値の精度は、セキュリティ上の懸念が他の手段で軽減された場合、またはされた場合に変更される可能性があります。

構文

t = performance.now();

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 ミリ秒となっています。

// 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 と呼ばれる一連のクロスオリジン攻撃を防止しています。

仕様

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

仕様書

Specification
High Resolution Time
# dom-performance-now

ブラウザーの互換性

BCD tables only load in the browser

関連情報