-
Notifications
You must be signed in to change notification settings - Fork 30k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
util: change inspect depth default #17907
Conversation
@@ -317,7 +317,9 @@ Object.defineProperty(inspect, 'defaultOptions', { | |||
if (options === null || typeof options !== 'object') { | |||
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object'); | |||
} | |||
Object.assign(inspectDefaultOptions, options); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason for not using _extend
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The type check has to be done again in that case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I doubt it will add a noticeable overhead but yes it makes sense.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Do we actually care about the performance of inspection? I thought we didn’t.
- Same concern here as @lpinca. This is quite literally reinventing the wheel, and type checks for object are quite fast in modern V8.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated the use _extend as it will still be faster than Object.assign
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
About the performance - just recently I heard that inspect
came up in a flamegraph. Seems like people use it a lot. I am aware that setting the default options will not be a big thing but the first implementation (not changing inspect for console.*) used it a lot and that is why I decided to optimize it as well.
Not sure I like the complexity introduced here. Given that this is already flagged as |
@silverwind I do not see a big difference between 5 and unlimited. Most entries are not that deeply nested and if they are, you likely want to see everything. To prevent huge diffs, the max array entries option is way more efficient as this would otherwise be more difficult to handle. About the complexity: I am fine with showing everything as a new default for console.* and this would remove the complexity again. But it would be a more significant change and I tried to minimize the breaking change. For the repl it might be best to stay with the current default though. The reason is that some modules like |
@jasnell what do you think about removing the limit for |
Changing the default for |
Currently inspecting the BufferList can result a maximum call stack size error. Adding a individual inspect function prevents this.
The current default is not ideal in most use cases. Therefore it is changed to showing unlimited depth in case util.inspect is called directly. The default is kept as before for console.log and similar. Using console.dir will now show a depth of up to five and console.assert / console.trace will show a unlimited depth.
Object.assign is currently very slow. Using Object.keys is much faster in v8 6.3.
2bb38d6
to
2721767
Compare
I changed the code to default to unlimited for the console functions as well. CITGM https://ci.nodejs.org/view/Node.js-citgm/job/citgm-smoker/1179/ |
lib/internal/streams/BufferList.js
Outdated
@@ -73,4 +74,8 @@ module.exports = class BufferList { | |||
} | |||
return ret; | |||
} | |||
|
|||
[customInspectSymbol]() { | |||
return `${this.constructor.name} { length: ${this.length} }`; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could return { __proto__: Object.getPrototypeOf(this), length: this.length }
which would also give coloring etc. for free.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Using __proto__
will actually result in a `call stack size exceeded error. I decided to call inspect directly instead to highlight the color in case it is needed.
@@ -317,7 +317,9 @@ Object.defineProperty(inspect, 'defaultOptions', { | |||
if (options === null || typeof options !== 'object') { | |||
throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object'); | |||
} | |||
Object.assign(inspectDefaultOptions, options); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Do we actually care about the performance of inspection? I thought we didn’t.
- Same concern here as @lpinca. This is quite literally reinventing the wheel, and type checks for object are quite fast in modern V8.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you please change the documentation of util.inspect
(and add an entry to its history)?
lib/internal/streams/BufferList.js
Outdated
@@ -73,4 +75,9 @@ module.exports = class BufferList { | |||
} | |||
return ret; | |||
} | |||
|
|||
[customInspectSymbol]() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I’d just use util.inspect.custom
here, it saves people looking at this code one round-trip to another file
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
Since the default for depth is changed to `Infinity` it is logical to change the %o default to the same as well. Using %o with `util.format` will now always print the whole object.
I updated the documentation and added the history entry. I also changed the |
doc/api/util.md
Outdated
* `depth` {number} Specifies the number visible nested Objects in an `object`. | ||
This is useful to minimize the inspection output for large complicated | ||
objects. To make it recurse indefinitely pass `null` or `Infinity`. Defaults | ||
to `null`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
suggestion: Infinity
instead of null
to match the changelog?
The current default is not ideal in most use cases. Therefore it is changed to inspect objects to a maximum depth of 20 in case util.inspect is called with it's defaults. The default is kept at 2 when using console.log() and similar in the repl. PR-URL: nodejs#17907 Refs: nodejs#12693
Since the default for depth is changed to `20` it is logical to change the %o default as well. It will now always use the default depth. PR-URL: nodejs#17907 Refs: nodejs#12693
The current default is not ideal in most use cases. Therefore it is changed to inspect objects to a maximum depth of 20 in case util.inspect is called with it's defaults. The default is kept at 2 when using console.log() and similar in the repl. PR-URL: nodejs#17907 Refs: nodejs#12693 PR-URL: nodejs#22846 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io>
Since the default for depth is changed to `20` it is logical to change the %o default as well. It will now always use the default depth. PR-URL: nodejs#17907 Refs: nodejs#12693 PR-URL: nodejs#22846 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io>
Right now the defaults for
util.inspect
are often not ideal. This is a first step to improve those. I tried not to break to much and keep the current behavior for therepl
andconsole
.Refs: #12693
Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passesAffected core subsystem(s)
util, console