performance.now() - Web APIs 编辑
The performance.now()
method returns a DOMHighResTimeStamp
, measured in milliseconds.
Note:
This feature is available in Web Workers.The returned value represents the time elapsed since the time origin.
Bear in mind the following points:
- In dedicated workers created from a
Window
context, the value in the worker will be lower thanperformance.now()
in the window who spawned that worker. It used to be the same ast0
of the main context, but this was changed. - In shared or service workers, the value in the worker might be higher than that of the main context because that window can be created after those workers.
It's important to keep in mind that to mitigate potential security threats such as Spectre, browsers typically round the returned value by some amount in order to be less predictable. This inherently introduces a degree of inaccuracy by limiting the resolution or precision of the timer. For example, Firefox rounds the returned time to 1 millisecond increments.
The precision of the returned value is subject to change if/when the security concerns are alleviated through other means.
Syntax
t = performance.now();
Example
const t0 = performance.now();
doSomething();
const t1 = performance.now();
console.log(`Call to doSomething took ${t1 - t0} milliseconds.`);
Unlike other timing data available to JavaScript (for example Date.now
), the timestamps returned by performance.now()
are not limited to one-millisecond resolution. Instead, they represent times as floating-point numbers with up to microsecond precision.
Also unlike Date.now()
, the values returned by performance.now()
always increase at a constant rate, independent of the system clock (which might be adjusted manually or skewed by software like NTP). Otherwise, performance.timing.navigationStart + performance.now()
will be approximately equal to Date.now()
.
Reduced time precision
To offer protection against timing attacks and fingerprinting, the precision of performance.now()
might get rounded depending on browser settings.
In Firefox, the privacy.reduceTimerPrecision
preference is enabled by default and defaults to 1ms.
// reduced time precision (1ms) in Firefox 60
performance.now();
// 8781416
// 8781815
// 8782206
// ...
// reduced time precision with `privacy.resistFingerprinting` enabled
performance.now();
// 8865400
// 8866200
// 8866700
// ...
In Firefox, you can also enable privacy.resistFingerprinting
— this changes the precision to 100ms or the value of privacy.resistFingerprinting.reduceTimerPrecision.microseconds
, whichever is larger.
Starting with Firefox 79, high resolution timers can be used if you cross-origin isolate your document using the Cross-Origin-Opener-Policy
and Cross-Origin-Embedder-Policy
headers:
Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp
These headers ensure a top-level document does not share a browsing context group with cross-origin documents. COOP process-isolates your document and potential attackers can't access to your global object if they were opening it in a popup, preventing a set of cross-origin attacks dubbed XS-Leaks.
Specifications
Specification | Status | Comment |
---|---|---|
High Resolution Time Level 2 The definition of 'performance.now()' in that specification. | Recommendation | Stricter definitions of interfaces and types. |
High Resolution Time The definition of 'performance.now()' in that specification. | Recommendation | Initial definition |
Browser compatibility
BCD tables only load in the browser
See also
- When milliseconds are not enough: performance.now() from HTML5 Rocks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论