Skip to content

events: speed up emit by create faster null prototype object

Rodrigo Muino Tomonari requested to merge github/fork/wwwzbwcom/speed-up-emit into main

We need to create null prototype to prevent internal method like toString mess with event handling. But in current version v8, Object create by ObjectSetPrototypeOf is much more efficient than ObjectCreate(null)

Here is benchmark result:

node benchmark/compare.js --old ./node-master --new ./node-dev --filter "ee-emit" events > compare-pr-dev.csv

[00:02:13|% 100| 1/1 files | 60/60 runs | 16/16 configs]: Done

cat compare-pr-dev.csv | Rscript benchmark/compare.R confidence improvement accuracy (*)   (**)   (***)
events/ee-emit.js listeners=0 argc=0 n=2000000          ***    275.72 %       ±4.94% ±6.64%  ±8.78%
events/ee-emit.js listeners=0 argc=10 n=2000000         ***    254.67 %       ±7.10% ±9.57% ±12.70%
events/ee-emit.js listeners=0 argc=2 n=2000000          ***    268.32 %       ±3.81% ±5.14%  ±6.82%
events/ee-emit.js listeners=0 argc=4 n=2000000          ***    273.33 %       ±2.03% ±2.72%  ±3.59%
events/ee-emit.js listeners=1 argc=0 n=2000000          ***    146.06 %       ±1.84% ±2.47%  ±3.27%
events/ee-emit.js listeners=1 argc=10 n=2000000         ***    142.00 %       ±2.38% ±3.18%  ±4.14%
events/ee-emit.js listeners=1 argc=2 n=2000000          ***    139.01 %       ±2.59% ±3.47%  ±4.56%
events/ee-emit.js listeners=1 argc=4 n=2000000          ***    139.66 %       ±5.62% ±7.56% ±10.03%
events/ee-emit.js listeners=10 argc=0 n=2000000         ***     18.10 %       ±1.07% ±1.42%  ±1.86%
events/ee-emit.js listeners=10 argc=10 n=2000000        ***     15.33 %       ±0.83% ±1.10%  ±1.44%
events/ee-emit.js listeners=10 argc=2 n=2000000         ***     15.87 %       ±0.94% ±1.25%  ±1.63%
events/ee-emit.js listeners=10 argc=4 n=2000000         ***     15.72 %       ±0.88% ±1.17%  ±1.53%
events/ee-emit.js listeners=5 argc=0 n=2000000          ***     19.38 %       ±0.73% ±0.97%  ±1.28%
events/ee-emit.js listeners=5 argc=10 n=2000000         ***     14.44 %       ±0.61% ±0.81%  ±1.05%
events/ee-emit.js listeners=5 argc=2 n=2000000          ***     21.09 %       ±1.58% ±2.12%  ±2.81%
events/ee-emit.js listeners=5 argc=4 n=2000000          ***     15.77 %       ±0.79% ±1.04%  ±1.36%

Be aware that when doing many comparisons the risk of a false-positive
result increases. In this case, there are 16 comparisons, you can thus
expect the following amount of false-positive results:
  0.80 false positives, when considering a   5% risk acceptance (*, **, ***),
  0.16 false positives, when considering a   1% risk acceptance (**, ***),
  0.02 false positives, when considering a 0.1% risk acceptance (***)

Merge request reports

Loading