-
-
Notifications
You must be signed in to change notification settings - Fork 33.3k
Closed
Labels
bufferIssues and PRs related to the buffer subsystem.Issues and PRs related to the buffer subsystem.performanceIssues and PRs related to the performance of Node.js.Issues and PRs related to the performance of Node.js.
Description
For Buffer.byteLength(string[, encoding])
, when set encoding
is buffer
:
buffers/buffer-bytelength.js n=4000000 len=16 encoding='buffer' *** -36.69 % ±1.78% ±2.38% ±3.09%
buffers/buffer-bytelength.js n=4000000 len=2 encoding='buffer' *** -35.95 % ±3.34% ±4.48% ±5.91%
buffers/buffer-bytelength.js n=4000000 len=256 encoding='buffer' *** -35.46 % ±5.18% ±6.95% ±9.17%
During my investigation, I found that the performance regression might be due to ArrayBufferView.byteLength
.
for the implementation of Buffer.byteLength
in lib
:
function byteLength(string, encoding) {
if (typeof string !== 'string') {
if (isArrayBufferView(string) || isAnyArrayBuffer(string)) {
return string.byteLength;
}
// ...
}
}
when string.byteLength
is not called in either v18.x or v22.x(for example, change to return 0
), the regression nearly disappears:
confidence improvement accuracy (*) (**) (***)
buffers/buffer-bytelength-buffer.js n=60000000 len=16 *** -3.16 % ±1.25% ±1.66% ±2.16%
buffers/buffer-bytelength-buffer.js n=60000000 len=2 -1.39 % ±2.15% ±2.86% ±3.74%
buffers/buffer-bytelength-buffer.js n=60000000 len=256 ** -2.16 % ±1.28% ±1.72% ±2.25%
Based on the findings, it appears that the handling of ArrayBufferView.byteLength
might be the cause of the performance regression observed.
Metadata
Metadata
Assignees
Labels
bufferIssues and PRs related to the buffer subsystem.Issues and PRs related to the buffer subsystem.performanceIssues and PRs related to the performance of Node.js.Issues and PRs related to the performance of Node.js.