diff --git a/benchmark/streams/writable-buffered-drain.js b/benchmark/streams/writable-buffered-drain.js new file mode 100644 index 000000000000..5ebed16624ea --- /dev/null +++ b/benchmark/streams/writable-buffered-drain.js @@ -0,0 +1,25 @@ +'use strict'; + +const common = require('../common'); +const { Writable } = require('stream'); + +const bench = common.createBenchmark(main, { + count: [1024, 16384, 65536], + n: [100], +}); + +function main({ count, n }) { + const chunk = {}; + let callback; + const stream = new Writable({ + objectMode: true, + write(chunk, encoding, cb) { callback = cb; }, + }); + + bench.start(); + for (let i = 0; i < n; i++) { + for (let j = 0; j < count; j++) stream.write(chunk); + for (let j = 0; j < count; j++) callback(); + } + bench.end(n); +} diff --git a/lib/internal/streams/writable.js b/lib/internal/streams/writable.js index 47e003ea3a8a..09d713f8a1fe 100644 --- a/lib/internal/streams/writable.js +++ b/lib/internal/streams/writable.js @@ -787,7 +787,7 @@ function clearBuffer(stream, state) { if (i === buffered.length) { resetBuffer(state); - } else if (i > 256) { + } else if (i > 256 && i * 2 >= buffered.length) { buffered.splice(0, i); state.bufferedIndex = 0; } else {