From 8aede75b9e5fa5c3df7c14bd9e6b1cc09623c092 Mon Sep 17 00:00:00 2001 From: Peter Romianowski Date: Sat, 12 Oct 2019 17:06:08 +0200 Subject: [PATCH 1/2] Improved performance of Pipeline.exec --- lib/pipeline.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/pipeline.ts b/lib/pipeline.ts index e5ea2a59..09e28ace 100644 --- a/lib/pipeline.ts +++ b/lib/pipeline.ts @@ -303,6 +303,7 @@ Pipeline.prototype.exec = function(callback: CallbackFunction) { function execPipeline() { let data: Buffer | string = ""; + let buffers: Buffer[]; let writePending: number = (_this.replyPending = _this._queue.length); let node; @@ -319,16 +320,25 @@ Pipeline.prototype.exec = function(callback: CallbackFunction) { bufferMode = true; } if (bufferMode) { - data = Buffer.concat([ - typeof data === "string" ? Buffer.from(data, "utf8") : data, + if (!buffers) { + buffers = []; + } + if (typeof data === "string") { + buffers.push(Buffer.from(data, "utf8")); + data = undefined; + } + buffers.push( typeof writable === "string" ? Buffer.from(writable, "utf8") : writable - ]); + ); } else { data += writable; } if (!--writePending) { + if (buffers) { + data = Buffer.concat(buffers); + } if (_this.isCluster) { node.redis.stream.write(data); } else { From 1abe7b3365f4a28ad79700a3c3a71a43cf5efea0 Mon Sep 17 00:00:00 2001 From: Peter Romianowski Date: Sat, 12 Oct 2019 17:27:10 +0200 Subject: [PATCH 2/2] Reset buffers and made code more readable --- lib/pipeline.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/pipeline.ts b/lib/pipeline.ts index 09e28ace..ca436959 100644 --- a/lib/pipeline.ts +++ b/lib/pipeline.ts @@ -302,7 +302,7 @@ Pipeline.prototype.exec = function(callback: CallbackFunction) { .then(execPipeline); function execPipeline() { - let data: Buffer | string = ""; + let data = ""; let buffers: Buffer[]; let writePending: number = (_this.replyPending = _this._queue.length); @@ -336,18 +336,22 @@ Pipeline.prototype.exec = function(callback: CallbackFunction) { data += writable; } if (!--writePending) { + let sendData: Buffer | string; if (buffers) { - data = Buffer.concat(buffers); + sendData = Buffer.concat(buffers); + } else { + sendData = data; } if (_this.isCluster) { - node.redis.stream.write(data); + node.redis.stream.write(sendData); } else { - _this.redis.stream.write(data); + _this.redis.stream.write(sendData); } // Reset writePending for resending writePending = _this._queue.length; data = ""; + buffers = undefined; bufferMode = false; } }