diff options
author | Weijia Wang <starkwang@126.com> | 2019-02-08 13:53:57 +0800 |
---|---|---|
committer | Weijia Wang <381152119@qq.com> | 2019-02-11 13:35:58 +0800 |
commit | 0b585457eef91bd905f13c5d88b4c6023ddf07fc (patch) | |
tree | c61c0fe2e0b8ca9b3ca8af9fc3c4b8a580ba266b /lib/_http_outgoing.js | |
parent | 2e405e576bd629f9c4be4a13c74801b4c81ab378 (diff) | |
download | android-node-v8-0b585457eef91bd905f13c5d88b4c6023ddf07fc.tar.gz android-node-v8-0b585457eef91bd905f13c5d88b4c6023ddf07fc.tar.bz2 android-node-v8-0b585457eef91bd905f13c5d88b4c6023ddf07fc.zip |
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 <info@bnoordhuis.nl>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
Diffstat (limited to 'lib/_http_outgoing.js')
-rw-r--r-- | lib/_http_outgoing.js | 43 |
1 files changed, 20 insertions, 23 deletions
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; |