★ wanayoo — archive 1999 https://github.com/nodejs/node/commit/e81c6c81deNouvelle recherche | Portail wanayoo
Skip to content
Permalink
Browse files

perf_hooks: only enable GC tracking when it's requested

Previously a GC prologue callback and a GC epilogue callback
are always unconditionally enabled during bootstrap when
the `performance` binding is loaded, even when the user does
not use the performance timeline API to enable GC tracking.
This patch makes the callback addition conditional and only
enables them when the user explicitly requests
`observer.observe(['gc'])` to avoid the overhead.

PR-URL: #25853
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information...
joyeecheung authored and addaleax committed Jan 31, 2019
1 parent b7fb49e commit e81c6c81de712983959a2dd4e01048b4fee6fd7c
Showing with 14 additions and 4 deletions.
  1. +9 −1 lib/perf_hooks.js
  2. +5 −3 src/node_perf.cc
@@ -11,7 +11,8 @@ const {
timeOrigin,
timeOriginTimestamp,
timerify,
constants
constants,
setupGarbageCollectionTracking
} = internalBinding('performance');

const {
@@ -275,6 +276,8 @@ class PerformanceObserverEntryList {
}
}

let gcTrackingIsEnabled = false;

class PerformanceObserver extends AsyncResource {
constructor(callback) {
if (typeof callback !== 'function') {
@@ -336,6 +339,11 @@ class PerformanceObserver extends AsyncResource {
if (entryTypes.length === 0) {
throw new errors.ERR_VALID_PERFORMANCE_ENTRY_TYPE();
}
if (entryTypes.includes(NODE_PERFORMANCE_ENTRY_TYPE_GC) &&
!gcTrackingIsEnabled) {
setupGarbageCollectionTracking();
gcTrackingIsEnabled = true;
}
this.disconnect();
this[kBuffer][kEntries] = [];
L.init(this[kBuffer][kEntries]);
@@ -296,8 +296,10 @@ void MarkGarbageCollectionEnd(Isolate* isolate,
entry);
}

static void SetupGarbageCollectionTracking(
const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);

inline void SetupGarbageCollectionTracking(Environment* env) {
env->isolate()->AddGCPrologueCallback(MarkGarbageCollectionStart,
static_cast<void*>(env));
env->isolate()->AddGCEpilogueCallback(MarkGarbageCollectionEnd,
@@ -416,6 +418,8 @@ void Initialize(Local<Object> target,
env->SetMethod(target, "markMilestone", MarkMilestone);
env->SetMethod(target, "setupObservers", SetupPerformanceObservers);
env->SetMethod(target, "timerify", Timerify);
env->SetMethod(
target, "setupGarbageCollectionTracking", SetupGarbageCollectionTracking);

Local<Object> constants = Object::New(isolate);

@@ -452,8 +456,6 @@ void Initialize(Local<Object> target,
env->constants_string(),
constants,
attr).ToChecked();

SetupGarbageCollectionTracking(env);
}

} // namespace performance

0 comments on commit e81c6c8

Please sign in to comment.
You can’t perform that action at this time.