Skip to content

Pre-compute useColors at instance creation, avoid function call per enabled call #32

@alanzabihi

Description

@alanzabihi

Hypothesis

The useColors() function is called at debug instance creation (common.js line 117) and the result is stored on the instance. However, formatArgs (node.js line 170) reads this.useColors via destructuring. If V8 has to walk the prototype chain or check property descriptors each time, caching useColors as a local in formatArgs or ensuring it is a direct property (not inherited) could help.

Actually, reviewing the code more carefully: useColors IS already stored as a direct property on the debug function (line 117). The real question is whether the ternary in formatArgs (if (useColors) { ... } else { ... }) can be avoided by pre-binding the correct formatArgs variant at init time.

Alternative approach: at init time, set debug._formatArgs to either the colored or uncolored variant. In the enabled path, call self._formatArgs(args) instead of createDebug.formatArgs.call(self, args). This avoids the if/else branch and the .call() overhead on every enabled call.

Scope

  • src/node.js: create two formatArgs variants (colored/uncolored) and assign the right one at init
  • src/common.js line 110: call self._formatArgs(args) instead of createDebug.formatArgs.call(self, args)

Expected impact

Small. Eliminates a branch and a .call() overhead per enabled call. The .call() creates a new this binding which has overhead.

Risks

Both files (common.js and node.js) need to change. The formatArgs function currently uses this to access namespace, color, diff, inspectOpts. The pre-bound variant would need to accept the debug instance explicitly or use closure binding.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions