summaryrefslogtreecommitdiff
path: root/ext/web/15_performance.js
diff options
context:
space:
mode:
authorsnek <snek@deno.com>2024-11-08 23:20:24 +0100
committerGitHub <noreply@github.com>2024-11-08 23:20:24 +0100
commit73fbd61bd016eebbf2776dc94c15a26bf39668d6 (patch)
treec7e5f4ee47f94f2279e745b1825959f82a66a22d /ext/web/15_performance.js
parentd4f1bd3dacf54c4625eef7828341b39286ead8cb (diff)
fix: performance.timeOrigin (#26787)
`performance.timeOrigin` was being set from when JS started executing, but `op_now` measures from an `std::time::Instant` stored in `OpState`, which is created at a completely different time. This caused `performance.timeOrigin` to be very incorrect. This PR corrects the origin and also cleans up some of the timer code. Compared to `Date.now()`, `performance`'s time origin is now consistently within 5us (0.005ms) of system time. ![image](https://github.com/user-attachments/assets/0a7be04a-4f6d-4816-bd25-38a2e6136926)
Diffstat (limited to 'ext/web/15_performance.js')
-rw-r--r--ext/web/15_performance.js24
1 files changed, 17 insertions, 7 deletions
diff --git a/ext/web/15_performance.js b/ext/web/15_performance.js
index ea5557278..9e0e310a5 100644
--- a/ext/web/15_performance.js
+++ b/ext/web/15_performance.js
@@ -1,6 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
import { primordials } from "ext:core/mod.js";
+import { op_now, op_time_origin } from "ext:core/ops";
const {
ArrayPrototypeFilter,
ArrayPrototypePush,
@@ -10,19 +11,34 @@ const {
Symbol,
SymbolFor,
TypeError,
+ TypedArrayPrototypeGetBuffer,
+ Uint8Array,
+ Uint32Array,
} = primordials;
import * as webidl from "ext:deno_webidl/00_webidl.js";
import { structuredClone } from "./02_structured_clone.js";
import { createFilteredInspectProxy } from "ext:deno_console/01_console.js";
import { EventTarget } from "./02_event.js";
-import { opNow } from "./02_timers.js";
import { DOMException } from "./01_dom_exception.js";
const illegalConstructorKey = Symbol("illegalConstructorKey");
let performanceEntries = [];
let timeOrigin;
+const hrU8 = new Uint8Array(8);
+const hr = new Uint32Array(TypedArrayPrototypeGetBuffer(hrU8));
+
+function setTimeOrigin() {
+ op_time_origin(hrU8);
+ timeOrigin = hr[0] * 1000 + hr[1] / 1e6;
+}
+
+function now() {
+ op_now(hrU8);
+ return hr[0] * 1000 + hr[1] / 1e6;
+}
+
webidl.converters["PerformanceMarkOptions"] = webidl
.createDictionaryConverter(
"PerformanceMarkOptions",
@@ -90,10 +106,6 @@ webidl.converters["DOMString or PerformanceMeasureOptions"] = (
return webidl.converters.DOMString(V, prefix, context, opts);
};
-function setTimeOrigin(origin) {
- timeOrigin = origin;
-}
-
function findMostRecent(
name,
type,
@@ -135,8 +147,6 @@ function filterByNameType(
);
}
-const now = opNow;
-
const _name = Symbol("[[name]]");
const _entryType = Symbol("[[entryType]]");
const _startTime = Symbol("[[startTime]]");