events: speed up emit by create faster null prototype object
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 (***)