-
Notifications
You must be signed in to change notification settings - Fork 29.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
stream: improve performance for sync write finishes
Improve performance and reduce memory usage when a writable stream is written to with the same callback (which is the most common case) and when the write operation finishes synchronously (which is also often the case). confidence improvement accuracy (*) (**) (***) streams/writable-manywrites.js sync='no' n=2000000 0.99 % ±3.20% ±4.28% ±5.61% streams/writable-manywrites.js sync='yes' n=2000000 *** 710.69 % ±19.65% ±26.47% ±35.09% Refs: #18013 Refs: #18367 PR-URL: #30710 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
- Loading branch information
Showing
3 changed files
with
66 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
const { Console } = require('console'); | ||
const { Writable } = require('stream'); | ||
const async_hooks = require('async_hooks'); | ||
|
||
// Make sure that repeated calls to console.log(), and by extension | ||
// stream.write() for the underlying stream, allocate exactly 1 tick object. | ||
// At the time of writing, that is enough to ensure a flat memory profile | ||
// from repeated console.log() calls, rather than having callbacks pile up | ||
// over time, assuming that data can be written synchronously. | ||
// Refs: https://github.com/nodejs/node/issues/18013 | ||
// Refs: https://github.com/nodejs/node/issues/18367 | ||
|
||
const checkTickCreated = common.mustCall(); | ||
|
||
async_hooks.createHook({ | ||
init(id, type, triggerId, resoure) { | ||
if (type === 'TickObject') checkTickCreated(); | ||
} | ||
}).enable(); | ||
|
||
const console = new Console(new Writable({ | ||
write: common.mustCall((chunk, encoding, cb) => { | ||
cb(); | ||
}, 100) | ||
})); | ||
|
||
for (let i = 0; i < 100; i++) | ||
console.log(i); |