From c59009e04e547bcb3001746ee85a4f9b640e6fd2 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Wed, 9 Jun 2021 00:28:08 +0800 Subject: [PATCH] bootstrap: load perf_hooks eagerly during bootstrap --- lib/internal/bootstrap/node.js | 23 +++++++---------------- lib/internal/event_target.js | 10 ++-------- test/parallel/test-bootstrap-modules.js | 2 ++ 3 files changed, 11 insertions(+), 24 deletions(-) diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 863d4ef5608bce..58f7396990dddb 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -241,10 +241,9 @@ if (!config.noBrowserGlobals) { defineOperation(globalThis, 'queueMicrotask', queueMicrotask); - defineLazyGlobal(globalThis, 'performance', () => { - const { performance } = require('perf_hooks'); - return performance; - }); + // https://www.w3.org/TR/hr-time-2/#the-performance-attribute + defineReplacableAttribute(globalThis, 'performance', + require('perf_hooks').performance); // Non-standard extensions: defineOperation(globalThis, 'clearImmediate', timers.clearImmediate); @@ -494,20 +493,12 @@ function defineOperation(target, name, method) { }); } -function defineLazyGlobal(target, name, loader) { - let value; - let overridden = false; +// https://heycam.github.io/webidl/#Replaceable +function defineReplacableAttribute(target, name, value) { ObjectDefineProperty(target, name, { + writable: true, enumerable: true, configurable: true, - get() { - if (value === undefined && !overridden) - value = loader(); - return value; - }, - set(val) { - value = val; - overridden = true; - } + value, }); } diff --git a/lib/internal/event_target.js b/lib/internal/event_target.js index 026746825b7767..825e1e8b2597ab 100644 --- a/lib/internal/event_target.js +++ b/lib/internal/event_target.js @@ -59,13 +59,7 @@ const kRemoveListener = Symbol('kRemoveListener'); const kIsNodeStyleListener = Symbol('kIsNodeStyleListener'); const kTrustEvent = Symbol('kTrustEvent'); -// Lazy load perf_hooks to avoid the additional overhead on startup -let perf_hooks; -function lazyNow() { - if (perf_hooks === undefined) - perf_hooks = require('perf_hooks'); - return perf_hooks.performance.now(); -} +const { now } = require('internal/perf/utils'); // TODO(joyeecheung): V8 snapshot does not support instance member // initializers for now: @@ -98,7 +92,7 @@ class Event { this[kComposed] = !!composed; this[kType] = `${type}`; this[kDefaultPrevented] = false; - this[kTimestamp] = lazyNow(); + this[kTimestamp] = now(); this[kPropagationStopped] = false; if (options?.[kTrustEvent]) { isTrustedSet.add(this); diff --git a/test/parallel/test-bootstrap-modules.js b/test/parallel/test-bootstrap-modules.js index 5cf9b8df2a38e6..0ca00f31adce8c 100644 --- a/test/parallel/test-bootstrap-modules.js +++ b/test/parallel/test-bootstrap-modules.js @@ -79,6 +79,7 @@ const expectedModules = new Set([ 'NativeModule internal/modules/esm/translators', 'NativeModule internal/process/esm_loader', 'NativeModule internal/options', + 'NativeModule internal/perf/event_loop_delay', 'NativeModule internal/perf/event_loop_utilization', 'NativeModule internal/perf/nodetiming', 'NativeModule internal/perf/observe', @@ -126,6 +127,7 @@ const expectedModules = new Set([ 'NativeModule internal/blob', 'NativeModule async_hooks', 'NativeModule path', + 'NativeModule perf_hooks', 'NativeModule querystring', 'NativeModule stream', 'NativeModule stream/promises',