Skip to content

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:

Before: Before

After: After

Merge request reports

Loading