try to improve stream perf
This is just a poc to see how much of improvement we can get if we don't have generic EventEmitter
(this is done by implementing for each event in Readable
+ Writable
a custom emit
and on
, off
, once
and more functions
this will break a lot of things...
00:25:05.593 ++ Rscript benchmark/compare.R
00:25:05.961 confidence improvement accuracy (*) (**) (***)
00:25:05.961 streams/creation.js kind='duplex' n=50000000 *** -7.76 % ±0.82% ±1.09% ±1.43%
00:25:05.961 streams/creation.js kind='readable' n=50000000 *** 2.98 % ±0.56% ±0.74% ±0.97%
00:25:05.961 streams/creation.js kind='transform' n=50000000 *** 14.07 % ±1.37% ±1.84% ±2.43%
00:25:05.961 streams/creation.js kind='writable' n=50000000 *** 2.27 % ±0.69% ±0.92% ±1.20%
00:25:05.961 streams/destroy.js kind='duplex' n=1000000 *** -1.37 % ±0.45% ±0.60% ±0.78%
00:25:05.961 streams/destroy.js kind='readable' n=1000000 *** 6.01 % ±3.03% ±4.08% ±5.40%
00:25:05.961 streams/destroy.js kind='transform' n=1000000 * -0.47 % ±0.45% ±0.59% ±0.77%
00:25:05.961 streams/destroy.js kind='writable' n=1000000 0.11 % ±0.61% ±0.81% ±1.06%
00:25:05.961 streams/pipe-object-mode.js n=5000000 *** -25.59 % ±0.28% ±0.37% ±0.49%
00:25:05.961 streams/pipe.js n=5000000 *** -15.50 % ±0.55% ±0.74% ±0.97%
00:25:05.961 streams/readable-async-iterator.js sync='no' n=100000 0.49 % ±0.88% ±1.17% ±1.53%
00:25:05.961 streams/readable-async-iterator.js sync='yes' n=100000 -0.01 % ±1.41% ±1.87% ±2.45%
00:25:05.961 streams/readable-bigread.js n=1000 ** 0.88 % ±0.58% ±0.77% ±1.00%
00:25:05.961 streams/readable-bigunevenread.js n=1000 *** 1.24 % ±0.45% ±0.60% ±0.78%
00:25:05.961 streams/readable-boundaryread.js type='buffer' n=2000 -0.54 % ±0.71% ±0.94% ±1.23%
00:25:05.961 streams/readable-boundaryread.js type='string' n=2000 *** 2.95 % ±0.99% ±1.33% ±1.75%
00:25:05.961 streams/readable-from.js type='array' n=10000000 *** -27.06 % ±1.18% ±1.58% ±2.08%
00:25:05.962 streams/readable-from.js type='async-generator' n=10000000 *** -8.07 % ±0.91% ±1.20% ±1.57%
00:25:05.962 streams/readable-from.js type='sync-generator-with-async-values' n=10000000 *** -9.82 % ±1.08% ±1.46% ±1.93%
00:25:05.962 streams/readable-from.js type='sync-generator-with-sync-values' n=10000000 *** -17.39 % ±0.58% ±0.77% ±1.02%
00:25:05.962 streams/readable-readall.js n=5000 1.14 % ±1.53% ±2.04% ±2.65%
00:25:05.962 streams/readable-uint8array.js kind='encoding' n=1000000 *** -2.04 % ±1.17% ±1.56% ±2.03%
00:25:05.962 streams/readable-uint8array.js kind='read' n=1000000 0.14 % ±1.44% ±1.91% ±2.49%
00:25:05.962 streams/readable-unevenread.js n=1000 -0.53 % ±0.63% ±0.84% ±1.10%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='no' n=100000 *** -2.52 % ±1.43% ±1.91% ±2.49%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='yes' n=100000 ** -2.13 % ±1.37% ±1.83% ±2.41%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='no' n=100000 *** -3.13 % ±1.67% ±2.23% ±2.92%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='yes' n=100000 -0.48 % ±0.76% ±1.02% ±1.32%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='no' n=100000 -0.76 % ±2.51% ±3.35% ±4.36%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='yes' n=100000 -0.63 % ±0.77% ±1.03% ±1.34%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='no' n=100000 *** -2.23 % ±0.51% ±0.68% ±0.88%
00:25:05.962 streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='yes' n=100000 * -1.58 % ±1.47% ±1.96% ±2.55%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='no' n=100000 *** -2.27 % ±1.25% ±1.66% ±2.16%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='yes' n=100000 ** -1.02 % ±0.76% ±1.01% ±1.31%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='no' n=100000 *** -3.85 % ±0.60% ±0.79% ±1.03%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='yes' n=100000 -1.38 % ±1.72% ±2.31% ±3.04%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='no' n=100000 *** -4.49 % ±2.17% ±2.89% ±3.78%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='yes' n=100000 *** -0.96 % ±0.56% ±0.74% ±0.96%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='no' n=100000 *** -4.60 % ±1.66% ±2.21% ±2.87%
00:25:05.962 streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='yes' n=100000 -0.66 % ±1.86% ±2.49% ±3.25%
00:25:05.962 streams/writable-uint8array.js kind='object-mode' n=50000000 0.00 % ±0.54% ±0.71% ±0.93%
00:25:05.962 streams/writable-uint8array.js kind='write' n=50000000 0.19 % ±0.37% ±0.50% ±0.66%
00:25:05.962 streams/writable-uint8array.js kind='writev' n=50000000 *** 0.76 % ±0.23% ±0.31% ±0.41%
00:25:05.962
00:25:05.962 Be aware that when doing many comparisons the risk of a false-positive
00:25:05.962 result increases. In this case, there are 43 comparisons, you can thus
00:25:05.962 expect the following amount of false-positive results:
00:25:05.962 2.15 false positives, when considering a 5% risk acceptance (*, **, ***),
00:25:05.962 0.43 false positives, when considering a 1% risk acceptance (**, ***),
00:25:05.962 0.04 false positives, when considering a 0.1% risk acceptance (***)
2nd Streams benchmark URL after having single event handler value
confidence improvement accuracy (*) (**) (***)
streams/creation.js kind='duplex' n=50000000 *** -7.76 % ±0.65% ±0.86% ±1.13%
streams/creation.js kind='readable' n=50000000 *** 3.22 % ±0.63% ±0.83% ±1.09%
streams/creation.js kind='transform' n=50000000 *** 11.42 % ±1.46% ±1.95% ±2.57%
streams/creation.js kind='writable' n=50000000 *** 2.37 % ±0.63% ±0.84% ±1.09%
streams/destroy.js kind='duplex' n=1000000 *** -0.98 % ±0.37% ±0.49% ±0.63%
streams/destroy.js kind='readable' n=1000000 0.69 % ±2.37% ±3.16% ±4.14%
streams/destroy.js kind='transform' n=1000000 *** -1.33 % ±0.59% ±0.78% ±1.02%
streams/destroy.js kind='writable' n=1000000 -0.06 % ±0.69% ±0.92% ±1.20%
streams/pipe-object-mode.js n=5000000 *** 5.30 % ±0.27% ±0.35% ±0.46%
streams/pipe.js n=5000000 ** 2.81 % ±1.91% ±2.58% ±3.42%
streams/readable-async-iterator.js sync='no' n=100000 *** 4.83 % ±1.19% ±1.59% ±2.10%
streams/readable-async-iterator.js sync='yes' n=100000 -0.04 % ±1.19% ±1.58% ±2.06%
streams/readable-bigread.js n=1000 0.24 % ±0.56% ±0.74% ±0.97%
streams/readable-bigunevenread.js n=1000 *** 0.97 % ±0.52% ±0.70% ±0.91%
streams/readable-boundaryread.js type='buffer' n=2000 0.82 % ±0.83% ±1.11% ±1.44%
streams/readable-boundaryread.js type='string' n=2000 0.64 % ±1.24% ±1.66% ±2.16%
streams/readable-from.js type='array' n=10000000 *** -2.85 % ±1.57% ±2.08% ±2.71%
streams/readable-from.js type='async-generator' n=10000000 *** 6.29 % ±0.46% ±0.61% ±0.80%
streams/readable-from.js type='sync-generator-with-async-values' n=10000000 *** 9.86 % ±0.24% ±0.32% ±0.41%
streams/readable-from.js type='sync-generator-with-sync-values' n=10000000 *** -2.30 % ±0.20% ±0.27% ±0.35%
streams/readable-readall.js n=5000 ** 2.83 % ±1.71% ±2.28% ±2.97%
streams/readable-uint8array.js kind='encoding' n=1000000 *** -3.08 % ±0.92% ±1.23% ±1.61%
streams/readable-uint8array.js kind='read' n=1000000 -0.19 % ±2.12% ±2.82% ±3.68%
streams/readable-unevenread.js n=1000 -0.64 % ±0.96% ±1.29% ±1.68%
streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='no' n=100000 -1.32 % ±2.01% ±2.68% ±3.49%
streams/writable-manywrites.js len=1024 callback='no' writev='no' sync='yes' n=100000 * -0.90 % ±0.82% ±1.10% ±1.43%
streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='no' n=100000 2.51 % ±2.71% ±3.64% ±4.82%
streams/writable-manywrites.js len=1024 callback='no' writev='yes' sync='yes' n=100000 ** -1.36 % ±0.85% ±1.13% ±1.48%
streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='no' n=100000 -0.37 % ±2.30% ±3.06% ±3.98%
streams/writable-manywrites.js len=1024 callback='yes' writev='no' sync='yes' n=100000 * -1.00 % ±0.83% ±1.11% ±1.45%
streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='no' n=100000 -0.37 % ±1.59% ±2.12% ±2.75%
streams/writable-manywrites.js len=1024 callback='yes' writev='yes' sync='yes' n=100000 -0.89 % ±1.63% ±2.17% ±2.83%
streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='no' n=100000 *** 6.52 % ±1.53% ±2.05% ±2.68%
streams/writable-manywrites.js len=32768 callback='no' writev='no' sync='yes' n=100000 * -0.74 % ±0.65% ±0.87% ±1.13%
streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='no' n=100000 0.82 % ±1.62% ±2.16% ±2.81%
streams/writable-manywrites.js len=32768 callback='no' writev='yes' sync='yes' n=100000 -1.05 % ±1.43% ±1.91% ±2.49%
streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='no' n=100000 ** 3.73 % ±2.64% ±3.52% ±4.60%
streams/writable-manywrites.js len=32768 callback='yes' writev='no' sync='yes' n=100000 -0.34 % ±0.61% ±0.82% ±1.07%
streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='no' n=100000 ** 1.97 % ±1.29% ±1.72% ±2.26%
streams/writable-manywrites.js len=32768 callback='yes' writev='yes' sync='yes' n=100000 ** -1.64 % ±1.00% ±1.34% ±1.74%
streams/writable-uint8array.js kind='object-mode' n=50000000 -0.05 % ±0.38% ±0.51% ±0.67%
streams/writable-uint8array.js kind='write' n=50000000 ** 0.30 % ±0.18% ±0.24% ±0.31%
streams/writable-uint8array.js kind='writev' n=50000000 *** 0.61 % ±0.31% ±0.42% ±0.54%
Be aware that when doing many comparisons the risk of a false-positive
result increases. In this case, there are 43 comparisons, you can thus
expect the following amount of false-positive results:
2.15 false positives, when considering a 5% risk acceptance (*, **, ***),
0.43 false positives, when considering a 1% risk acceptance (**, ***),
0.04 false positives, when considering a 0.1% risk acceptance (***)