Performance and timers
The Workers runtime supports a subset of the Performance
API ↗, used to measure timing and performance, as well as timing of subrequests and other operations.
The performance.now()
method ↗ returns timestamp in milliseconds, representing the time elapsed since performance.timeOrigin
.
When Workers are deployed to Cloudflare, as a security measure to mitigate against Spectre attacks, APIs that return timers, including performance.now()
↗ and Date.now()
↗, only advance or increment after I/O occurs. Consider the following examples:
By wrapping a subrequest in calls to performance.now()
or Date.now()
APIs, you can measure the timing of a subrequest, fetching a key from KV, an object from R2, or any other form of I/O in your Worker.
In local development, however, timers will increment regardless of whether I/O happens or not. This means that if you need to measure timing of a piece of code that is CPU intensive, that does not involve I/O, you can run your Worker locally, via Wrangler, which uses the open-source Workers runtime, workerd ↗ — the same runtime that your Worker runs in when deployed to Cloudflare.
The performance.timeOrigin
↗ API is a read-only property that returns a baseline timestamp to base other measurements off of.
In the Workers runtime, the timeOrigin
property returns 0.