From 3ec019637bea8d305b18d5bb8d169fb1db05af6a Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Tue, 19 Mar 2019 18:17:49 +0800 Subject: [PATCH] perf_hooks: load internal/errors eagerly Since `internal/errors` is loaded by many builtin modules and is currently the first module loaded during bootstrap, it is fine to load it eagerly. We just need to make sure that `internal/errors` itself load other modules lazily. PR-URL: https://github.com/nodejs/node/pull/26771 Reviewed-By: Yongsheng Zhang Reviewed-By: Ruben Bridgewater --- lib/perf_hooks.js | 52 ++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/lib/perf_hooks.js b/lib/perf_hooks.js index 02c617dfdf9e0f..3914dc5daa2be3 100644 --- a/lib/perf_hooks.js +++ b/lib/perf_hooks.js @@ -37,6 +37,15 @@ const L = require('internal/linkedlist'); const kInspect = require('internal/util').customInspectSymbol; const { inherits } = require('util'); +const { + ERR_INVALID_CALLBACK, + ERR_INVALID_ARG_VALUE, + ERR_INVALID_ARG_TYPE, + ERR_INVALID_OPT_VALUE, + ERR_VALID_PERFORMANCE_ENTRY_TYPE, + ERR_INVALID_PERFORMANCE_MARK +} = require('internal/errors').codes; + const kHandle = Symbol('handle'); const kMap = Symbol('map'); const kCallback = Symbol('callback'); @@ -126,14 +135,6 @@ function collectHttp2Stats(entry) { } } - -let errors; -function lazyErrors() { - if (errors === undefined) - errors = require('internal/errors').codes; - return errors; -} - function now() { const hr = process.hrtime(); return hr[0] * 1000 + hr[1] / 1e6; @@ -284,8 +285,7 @@ let gcTrackingIsEnabled = false; class PerformanceObserver extends AsyncResource { constructor(callback) { if (typeof callback !== 'function') { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_CALLBACK(); + throw new ERR_INVALID_CALLBACK(); } super('PerformanceObserver'); Object.defineProperties(this, { @@ -331,16 +331,15 @@ class PerformanceObserver extends AsyncResource { } observe(options) { - const errors = lazyErrors(); if (typeof options !== 'object' || options == null) { - throw new errors.ERR_INVALID_ARG_TYPE('options', 'Object', options); + throw new ERR_INVALID_ARG_TYPE('options', 'Object', options); } if (!Array.isArray(options.entryTypes)) { - throw new errors.ERR_INVALID_OPT_VALUE('entryTypes', options); + throw new ERR_INVALID_OPT_VALUE('entryTypes', options); } const entryTypes = options.entryTypes.filter(filterTypes).map(mapTypes); if (entryTypes.length === 0) { - throw new errors.ERR_VALID_PERFORMANCE_ENTRY_TYPE(); + throw new ERR_VALID_PERFORMANCE_ENTRY_TYPE(); } if (entryTypes.includes(NODE_PERFORMANCE_ENTRY_TYPE_GC) && !gcTrackingIsEnabled) { @@ -393,8 +392,7 @@ class Performance { startMark = startMark !== undefined ? `${startMark}` : ''; const marks = this[kIndex][kMarks]; if (!marks.has(endMark) && !(endMark in nodeTiming)) { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_PERFORMANCE_MARK(endMark); + throw new ERR_INVALID_PERFORMANCE_MARK(endMark); } _measure(name, startMark, endMark); } @@ -412,8 +410,7 @@ class Performance { timerify(fn) { if (typeof fn !== 'function') { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_ARG_TYPE('fn', 'Function', fn); + throw new ERR_INVALID_ARG_TYPE('fn', 'Function', fn); } if (fn[kTimerified]) return fn[kTimerified]; @@ -567,13 +564,11 @@ class ELDHistogram { get stddev() { return this[kHandle].stddev(); } percentile(percentile) { if (typeof percentile !== 'number') { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_ARG_TYPE('percentile', 'number', percentile); + throw new ERR_INVALID_ARG_TYPE('percentile', 'number', percentile); } if (percentile <= 0 || percentile > 100) { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_ARG_VALUE.RangeError('percentile', - percentile); + throw new ERR_INVALID_ARG_VALUE.RangeError('percentile', + percentile); } return this[kHandle].percentile(percentile); } @@ -597,18 +592,15 @@ class ELDHistogram { function monitorEventLoopDelay(options = {}) { if (typeof options !== 'object' || options === null) { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_ARG_TYPE('options', 'Object', options); + throw new ERR_INVALID_ARG_TYPE('options', 'Object', options); } const { resolution = 10 } = options; if (typeof resolution !== 'number') { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_ARG_TYPE('options.resolution', - 'number', resolution); + throw new ERR_INVALID_ARG_TYPE('options.resolution', + 'number', resolution); } if (resolution <= 0 || !Number.isSafeInteger(resolution)) { - const errors = lazyErrors(); - throw new errors.ERR_INVALID_OPT_VALUE.RangeError('resolution', resolution); + throw new ERR_INVALID_OPT_VALUE.RangeError('resolution', resolution); } return new ELDHistogram(new _ELDHistogram(resolution)); }