From 2efd72f28d7d7e2d3aa1fe08ce64390e1c6be947 Mon Sep 17 00:00:00 2001 From: Brian White Date: Tue, 27 Aug 2019 04:12:41 -0400 Subject: [PATCH] stream: improve read() performance PR-URL: https://github.com/nodejs/node/pull/29337 Reviewed-By: Matteo Collina Reviewed-By: James M Snell Reviewed-By: David Carlier --- lib/internal/streams/buffer_list.js | 54 +++++++++++++---------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/lib/internal/streams/buffer_list.js b/lib/internal/streams/buffer_list.js index 9d6e9e2fe4f7f9..715d5d201d4df4 100644 --- a/lib/internal/streams/buffer_list.js +++ b/lib/internal/streams/buffer_list.js @@ -98,33 +98,31 @@ module.exports = class BufferList { // Consumes a specified amount of characters from the buffered data. _getString(n) { - var p = this.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { + let ret = ''; + let p = this.head; + let c = 0; + do { const str = p.data; - const nb = (n > str.length ? str.length : n); - if (nb === str.length) + if (n > str.length) { ret += str; - else - ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { + n -= str.length; + } else { + if (n === str.length) { + ret += str; ++c; if (p.next) this.head = p.next; else this.head = this.tail = null; } else { + ret += str.slice(0, n); this.head = p; - p.data = str.slice(nb); + p.data = str.slice(n); } break; } ++c; - } + } while (p = p.next); this.length -= c; return ret; } @@ -132,33 +130,31 @@ module.exports = class BufferList { // Consumes a specified amount of bytes from the buffered data. _getBuffer(n) { const ret = Buffer.allocUnsafe(n); - var p = this.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { + const retLen = n; + let p = this.head; + let c = 0; + do { const buf = p.data; - const nb = (n > buf.length ? buf.length : n); - if (nb === buf.length) - ret.set(buf, ret.length - n); - else - ret.set(new Uint8Array(buf.buffer, buf.byteOffset, nb), ret.length - n); - n -= nb; - if (n === 0) { - if (nb === buf.length) { + if (n > buf.length) { + ret.set(buf, retLen - n); + n -= buf.length; + } else { + if (n === buf.length) { + ret.set(buf, retLen - n); ++c; if (p.next) this.head = p.next; else this.head = this.tail = null; } else { + ret.set(new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n); this.head = p; - p.data = buf.slice(nb); + p.data = buf.slice(n); } break; } ++c; - } + } while (p = p.next); this.length -= c; return ret; }