From 0b585457eef91bd905f13c5d88b4c6023ddf07fc Mon Sep 17 00:00:00 2001 From: Weijia Wang Date: Fri, 8 Feb 2019 13:53:57 +0800 Subject: http: reduce multiple output arrays into one Now we are using `output`, `outputEncodings` and `outputCallbacks` to hold pending data. Reducing them into one array `outputData` can slightly improve performance and reduce some redundant codes. PR-URL: https://github.com/nodejs/node/pull/26004 Reviewed-By: Ben Noordhuis Reviewed-By: Luigi Pinca Reviewed-By: Minwoo Jung --- lib/_http_outgoing.js | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) (limited to 'lib/_http_outgoing.js') diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index eb889a6eff..bc974cff80 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -70,9 +70,7 @@ function OutgoingMessage() { // Queue that holds all currently pending data, until the response will be // assigned to the socket (until it will its turn in the HTTP pipeline). - this.output = []; - this.outputEncodings = []; - this.outputCallbacks = []; + this.outputData = []; // `outputSize` is an approximate measure of how much data is queued on this // response. `_onPendingData` will be invoked to update similar global @@ -220,14 +218,18 @@ OutgoingMessage.prototype._send = function _send(data, encoding, callback) { data = this._header + data; } else { var header = this._header; - if (this.output.length === 0) { - this.output = [header]; - this.outputEncodings = ['latin1']; - this.outputCallbacks = [null]; + if (this.outputData.length === 0) { + this.outputData = [{ + data: header, + encoding: 'latin1', + callback: null + }]; } else { - this.output.unshift(header); - this.outputEncodings.unshift('latin1'); - this.outputCallbacks.unshift(null); + this.outputData.unshift({ + data: header, + encoding: 'latin1', + callback: null + }); } this.outputSize += header.length; this._onPendingData(header.length); @@ -254,7 +256,7 @@ function _writeRaw(data, encoding, callback) { if (conn && conn._httpMessage === this && conn.writable && !conn.destroyed) { // There might be pending data in the this.output buffer. - if (this.output.length) { + if (this.outputData.length) { this._flushOutput(conn); } else if (!data.length) { if (typeof callback === 'function') { @@ -273,9 +275,7 @@ function _writeRaw(data, encoding, callback) { return conn.write(data, encoding, callback); } // Buffer, as long as we're not destroyed. - this.output.push(data); - this.outputEncodings.push(encoding); - this.outputCallbacks.push(callback); + this.outputData.push({ data, encoding, callback }); this.outputSize += data.length; this._onPendingData(data.length); return false; @@ -738,7 +738,7 @@ OutgoingMessage.prototype.end = function end(chunk, encoding, callback) { // There is the first message on the outgoing queue, and we've sent // everything to the socket. debug('outgoing message end.'); - if (this.output.length === 0 && + if (this.outputData.length === 0 && this.connection && this.connection._httpMessage === this) { this._finish(); @@ -793,22 +793,19 @@ OutgoingMessage.prototype._flush = function _flush() { OutgoingMessage.prototype._flushOutput = function _flushOutput(socket) { var ret; - var outputLength = this.output.length; + var outputLength = this.outputData.length; if (outputLength <= 0) return ret; - var output = this.output; - var outputEncodings = this.outputEncodings; - var outputCallbacks = this.outputCallbacks; + var outputData = this.outputData; socket.cork(); for (var i = 0; i < outputLength; i++) { - ret = socket.write(output[i], outputEncodings[i], outputCallbacks[i]); + const { data, encoding, callback } = outputData[i]; + ret = socket.write(data, encoding, callback); } socket.uncork(); - this.output = []; - this.outputEncodings = []; - this.outputCallbacks = []; + this.outputData = []; this._onPendingData(-this.outputSize); this.outputSize = 0; -- cgit v1.2.3