From 6c70f6e7644d7d386a66c9dd4315e9c16678b42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCrg=C3=BCn=20Day=C4=B1o=C4=9Flu?= Date: Sun, 6 Sep 2026 11:40:50 +0200 Subject: [PATCH] stream: amortize writable buffer compaction MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Gürgün Dayıoğlu Assisted-by: Codex --- benchmark/streams/writable-buffered-drain.js | 25 ++++++++++++++++++++ lib/internal/streams/writable.js | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 benchmark/streams/writable-buffered-drain.js 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 {