From e07c4ffc395d83bbae3f440b372593a068fb02df Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Thu, 23 Apr 2020 21:48:30 +0200 Subject: [PATCH] stream: fix sync write perf regression While https://github.com/nodejs/node/pull/31046 did make async writes faster it at the same time made sync writes slower. This PR corrects this while maintaining performance improvements. PR-URL: https://github.com/nodejs/node/pull/33032 Reviewed-By: Ruben Bridgewater Reviewed-By: James M Snell Reviewed-By: Brian White Reviewed-By: Zeyu Yang --- lib/_stream_writable.js | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 2dc949316a2dce..4b353a52665efa 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -415,27 +415,24 @@ function onwrite(stream, er) { onwriteError(stream, state, er, cb); } } else { - if (!state.destroyed) { + if (state.buffered.length > state.bufferedIndex) { clearBuffer(stream, state); } - if (state.needDrain || cb !== nop || state.ending || state.destroyed) { - if (sync) { - // It is a common case that the callback passed to .write() is always - // the same. In that case, we do not schedule a new nextTick(), but - // rather just increase a counter, to improve performance and avoid - // memory allocations. - if (state.afterWriteTickInfo !== null && - state.afterWriteTickInfo.cb === cb) { - state.afterWriteTickInfo.count++; - } else { - state.afterWriteTickInfo = { count: 1, cb, stream, state }; - process.nextTick(afterWriteTick, state.afterWriteTickInfo); - } + + if (sync) { + // It is a common case that the callback passed to .write() is always + // the same. In that case, we do not schedule a new nextTick(), but + // rather just increase a counter, to improve performance and avoid + // memory allocations. + if (state.afterWriteTickInfo !== null && + state.afterWriteTickInfo.cb === cb) { + state.afterWriteTickInfo.count++; } else { - afterWrite(stream, state, 1, cb); + state.afterWriteTickInfo = { count: 1, cb, stream, state }; + process.nextTick(afterWriteTick, state.afterWriteTickInfo); } } else { - state.pendingcb--; + afterWrite(stream, state, 1, cb); } } } @@ -483,7 +480,7 @@ function errorBuffer(state, err) { // If there's something in the buffer waiting, then process it. function clearBuffer(stream, state) { - if (state.corked || state.bufferProcessing) { + if (state.corked || state.bufferProcessing || state.destroyed) { return; }