Skip to content

Buffer.byteLength Performance Regression from v18.x to v22.x #50620

Closed
@kylo5aby

Description

@kylo5aby

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

No one assigned

    Labels

    bufferIssues and PRs related to the buffer subsystem.performanceIssues and PRs related to the performance of Node.js.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions