Performance: now() method
=========================

The **`performance.now()`** method returns a high resolution timestamp in milliseconds. It represents the time elapsed since `Performance.timeOrigin` (the time when navigation has started in window contexts, or the time when the worker is run in `Worker` and `ServiceWorker` contexts).

Syntax
------


```js
now()
```

### Parameters

None.

### Return value

Returns a `DOMHighResTimeStamp` measured in milliseconds.

Description
-----------

### `Performance.now` vs. `Date.now`

Unlike `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, `Date.now()` may have been impacted by system and user clock adjustments, clock skew, etc. as it is relative to the Unix epoch (1970-01-01T00:00:00Z) and dependent on the system clock.
 The `performance.now()` method on the other hand is relative to the `timeOrigin` property which is a monotonic clock: its current time never decreases and isn't subject to adjustments.

### `performance.now` specification changes

The semantics of the `performance.now()` method changed between High Resolution Time Level 1 and Level 2.

| Changes | Level 1 | Level 2 |
| --- | --- | --- |
| Relative to | `performance.timing.navigationStart` | `Performance.timeOrigin` |
| Triggering conditions | Document fetch or unload prompt (if any). | Creation of the browsing context (if no prior document), unload prompt (if any), or start of the navigation (as defined in HTML, a few steps before fetch). |

The `performance.now()` method used to be relative to `performance.timing.navigationStart` property from the Navigation Timing specification. This changed and `performance.now()` is now relative to `Performance.timeOrigin` which avoids clock change risks when comparing timestamps across webpages.


```js
// Level 1 (clock change risks)
currentTime = performance.timing.navigationStart + performance.now();

// Level 2 (no clock change risks)
currentTime = performance.timeOrigin + performance.now();
```

### Ticking during sleep

The specification (Level 2) requires that `performance.now()` should tick during sleep. It appears that only Firefox on Windows, and Chromiums on Windows keep ticking during sleep. Relevant browser bugs for other operating systems:

* Chrome/Chromium (bug)
* Firefox (bug)
* Safari/WebKit (bug)

More details can also be found in the specification issue hr-time#115.

Examples
--------

### Using `performance.now()`

To determine how much time has elapsed since a particular point in your code, you can do something like this:


```js
const t0 = performance.now();
doSomething();
const t1 = performance.now();
console.log(`Call to doSomething took ${t1 - t0} milliseconds.`);
```

Security requirements
---------------------

To offer protection against timing attacks and fingerprinting, `performance.now()` is coarsened based on site isolation status.

* Resolution in isolated contexts: 5 microseconds
* Resolution in non-isolated contexts: 100 microseconds

 Cross-origin isolate your site using the `Cross-Origin-Opener-Policy` and
 `Cross-Origin-Embedder-Policy` headers:


```http
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 |
| --- |
| High Resolution Time # dom-performance-now |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Performance.timeOrigin`