stream: use bitmap in writable state
same as the following PR but for writable:
Benchmark CI output:
confidence improvement accuracy (*) (**) (***)
streams/creation.js kind='duplex' n=50000000 *** 10.15 % ±1.04% ±1.39% ±1.81%
streams/creation.js kind='readable' n=50000000 *** -1.59 % ±0.64% ±0.85% ±1.11%
streams/creation.js kind='transform' n=50000000 3.94 % ±4.16% ±5.58% ±7.37%
streams/creation.js kind='writable' n=50000000 *** 14.64 % ±1.57% ±2.09% ±2.73%
streams/destroy.js kind='duplex' n=1000000 *** 13.30 % ±3.37% ±4.52% ±5.95%
streams/destroy.js kind='readable' n=1000000 1.01 % ±2.03% ±2.70% ±3.51%
streams/destroy.js kind='transform' n=1000000 *** 16.34 % ±4.79% ±6.43% ±8.50%
streams/destroy.js kind='writable' n=1000000 *** 17.12 % ±3.07% ±4.08% ±5.32%
streams/pipe-object-mode.js n=5000000 1.87 % ±3.01% ±4.01% ±5.23%
streams/pipe.js n=5000000 0.17 % ±2.36% ±3.15% ±4.09%
streams/readable-async-iterator.js sync='no' n=100000 -0.51 % ±6.21% ±8.27% ±10.76%
streams/readable-async-iterator.js sync='yes' n=100000 -0.90 % ±5.11% ±6.80% ±8.85%
streams/readable-bigread.js n=1000 0.91 % ±1.66% ±2.21% ±2.88%
streams/readable-bigunevenread.js n=1000 4.99 % ±5.19% ±6.91% ±8.99%
streams/readable-boundaryread.js type='buffer' n=2000 -1.70 % ±1.80% ±2.39% ±3.12%
streams/readable-boundaryread.js type='string' n=2000 -0.86 % ±1.74% ±2.32% ±3.04%
streams/readable-from.js n=10000000 -1.03 % ±2.16% ±2.87% ±3.74%
streams/readable-readall.js n=5000 -0.54 % ±1.70% ±2.27% ±2.97%
streams/readable-unevenread.js n=1000 * 0.54 % ±0.46% ±0.61% ±0.80%
streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='no' n=2000000 2.09 % ±2.82% ±3.75% ±4.88%
streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='yes' n=2000000 4.51 % ±10.23% ±13.61% ±17.71%
streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='no' n=2000000 -2.82 % ±7.02% ±9.34% ±12.16%
streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='yes' n=2000000 5.14 % ±8.67% ±11.55% ±15.04%
streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='no' n=2000000 * 3.14 % ±2.83% ±3.77% ±4.91%
streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='yes' n=2000000 9.35 % ±9.50% ±12.64% ±16.47%
streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='no' n=2000000 -3.87 % ±8.31% ±11.06% ±14.39%
streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='yes' n=2000000 3.68 % ±7.45% ±9.92% ±12.91%
streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='no' n=2000000 1.75 % ±2.46% ±3.28% ±4.28%
streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='yes' n=2000000 *** -7.14 % ±3.16% ±4.21% ±5.48%
streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='no' n=2000000 -0.14 % ±3.44% ±4.58% ±5.97%
streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='yes' n=2000000 ** -4.60 % ±3.03% ±4.03% ±5.25%
streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='no' n=2000000 -1.23 % ±3.16% ±4.21% ±5.49%
streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='yes' n=2000000 -2.38 % ±3.54% ±4.71% ±6.13%
streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='no' n=2000000 1.02 % ±3.22% ±4.29% ±5.59%
streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='yes' n=2000000 ** -5.14 % ±3.52% ±4.68% ±6.10%
Be aware that when doing many comparisons the risk of a false-positive
result increases. In this case, there are 35 comparisons, you can thus
expect the following amount of false-positive results:
1.75 false positives, when considering a 5% risk acceptance (*, **, ***),
0.35 false positives, when considering a 1% risk acceptance (**, ***),
0.04 false positives, when considering a 0.1% risk acceptance (***)
For this script:
const {Writable} = require('node:stream');
let w;
for (let i = 0; i < 1000; i++) {
w = new Writable();
}
// eliminate v8 dead code elimination
console.assert(w);
the system analyzer shows a big reduction in size: