--- title: performance.now() slug: Web/API/Performance/now tags: - API - Method - Performance - Reference - Web Performance API translation_of: Web/API/Performance/now ---
performance.now()
メソッドは、ミリ秒単位で計測された {{domxref("DOMHighResTimeStamp")}} を返します。
タイムスタンプは実際には高解像度ではありません。Spectre のようなセキュリティ上の脅威を軽減するために、ブラウザは現在、さまざまな程度まで結果を丸めています (Firefox は Firefox 59 から 2 ミリ秒に丸めています)。ブラウザによっては、タイムスタンプを少しランダム化するものもあります。 精度は将来のリリースで改善されることでしょう。ブラウザの開発者は、これらのタイミング攻撃と、それを軽減する最善策について調査しています。
{{AvailableInWorkers}}
戻り値は、time origin からの経過時間を表します。
次の点に留意してください:
performance.now()
の値よりも小さい値となるでしょう。従来はメインコンテキストの t0
と同じでしたが、これは変わりました。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
のどちらか大きい方へ変更します。
仕様書 | 策定状況 | コメント |
---|---|---|
{{SpecName('Highres Time Level 2', '#dom-performance-now', 'performance.now()')}} | {{Spec2('Highres Time Level 2')}} | インターフェイスと型について、より厳密な定義 |
{{SpecName('Highres Time', '#dom-performance-now', 'performance.now()')}} | {{Spec2('Highres Time')}} | 初期定義 |
{{Compat("api.Performance.now")}}