performance.now()

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

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

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

戻り値は、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() の定義
勧告 初期定義

ブラウザー実装状況

BCD tables only load in the browser

関連情報