Skip to content

Commit

Permalink
events: optimize performance of add, remove, emit
Browse files Browse the repository at this point in the history
If more than one handler is bound to an event type, avoid copying
it on emit and instead set a flag that regulates whether to make
a copy when a new event is added or removed.

Do not use delete or Object.create(null) when removing listeners,
instead set to undefined and modify other methods to account
for this.
  • Loading branch information
apapirovski committed Nov 26, 2017
1 parent 3a4fe77 commit 7aca9c8
Show file tree
Hide file tree
Showing 10 changed files with 223 additions and 94 deletions.
18 changes: 15 additions & 3 deletions benchmark/events/ee-add-remove.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,30 @@
const common = require('../common.js');
const events = require('events');

const bench = common.createBenchmark(main, { n: [25e4] });
const bench = common.createBenchmark(main, {
n: [5e6],
events: [0, 5],
listeners: [1, 5]
});

function main(conf) {
const n = conf.n | 0;
let n = conf.n | 0;
const eventsCOunt = conf.events | 0;
const listenersCount = conf.listeners | 0;

const ee = new events.EventEmitter();
const listeners = [];

if (listenersCount === 1)
n *= 2;

var k;
for (k = 0; k < 10; k += 1)
for (k = 0; k < listenersCount; k += 1)
listeners.push(function() {});

for (k = 0; k < eventsCOunt; k++)
ee.on(`dummyunused${k}`, () => {});

bench.start();
for (var i = 0; i < n; i += 1) {
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
Expand Down
36 changes: 36 additions & 0 deletions benchmark/events/ee-emit-multi.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
'use strict';
const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, {
n: [2e7],
listeners: [1, 5, 10],
});

function main(conf) {
var n = conf.n | 0;
const listeners = Math.max(conf.listeners | 0, 1);

const ee = new EventEmitter();

if (listeners === 1)
n *= 5;
else if (listeners === 5)
n *= 2;

for (var k = 0; k < listeners; k += 1) {
ee.on('dummy', function() {});
ee.on(`dummy${k}`, function() {});
}

bench.start();
for (var i = 0; i < n; i += 1) {
if (i % 3 === 0)
ee.emit('dummy', true, 5);
else if (i % 2 === 0)
ee.emit('dummy', true, 5, 10, false);
else
ee.emit('dummy');
}
bench.end(n);
}
13 changes: 10 additions & 3 deletions benchmark/events/ee-emit.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,27 @@ const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, {
n: [2e6],
n: [2e7],
argc: [0, 2, 4, 10],
listeners: [1, 5, 10],
});

function main(conf) {
const n = conf.n | 0;
var n = conf.n | 0;
const argc = conf.argc | 0;
const listeners = Math.max(conf.listeners | 0, 1);

const ee = new EventEmitter();

for (var k = 0; k < listeners; k += 1)
if (listeners === 1)
n *= 5;
else if (listeners === 5)
n *= 2;

for (var k = 0; k < listeners; k += 1) {
ee.on('dummy', function() {});
ee.on(`dummy${k}`, function() {});
}

var i;
switch (argc) {
Expand Down
30 changes: 30 additions & 0 deletions benchmark/events/ee-event-names.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
'use strict';
const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, { n: [1e6] });

function main(conf) {
const n = conf.n | 0;

const ee = new EventEmitter();

for (var k = 0; k < 9; k += 1) {
ee.on(`dummy0${k}`, function() {});
ee.on(`dummy1${k}`, function() {});
ee.on(`dummy2${k}`, function() {});
}

ee.removeAllListeners('dummy01');
ee.removeAllListeners('dummy11');
ee.removeAllListeners('dummy21');
ee.removeAllListeners('dummy06');
ee.removeAllListeners('dummy16');
ee.removeAllListeners('dummy26');

bench.start();
for (var i = 0; i < n; i += 1) {
ee.eventNames();
}
bench.end(n);
}
2 changes: 1 addition & 1 deletion benchmark/events/ee-listeners-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, { n: [5e6] });
const bench = common.createBenchmark(main, { n: [1e7] });

function main(conf) {
const n = conf.n | 0;
Expand Down
2 changes: 1 addition & 1 deletion benchmark/events/ee-listeners.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, { n: [5e6] });
const bench = common.createBenchmark(main, { n: [5e7] });

function main(conf) {
const n = conf.n | 0;
Expand Down
16 changes: 12 additions & 4 deletions benchmark/events/ee-once.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,27 @@
const common = require('../common.js');
const EventEmitter = require('events').EventEmitter;

const bench = common.createBenchmark(main, { n: [2e7] });
const bench = common.createBenchmark(main, {
n: [5e6],
listeners: [1, 5]
});

function main(conf) {
const n = conf.n | 0;
let n = conf.n | 0;
const listeners = conf.listeners | 0;

if (listeners === 1)
n *= 2;

const ee = new EventEmitter();

function listener() {}

bench.start();
for (var i = 0; i < n; i += 1) {
for (var i = 0; i < n; ++i) {
const dummy = (i % 2 === 0) ? 'dummy0' : 'dummy1';
ee.once(dummy, listener);
for (var j = 0; j < listeners; ++j)
ee.once(dummy, listener);
ee.emit(dummy);
}
bench.end(n);
Expand Down
Loading

0 comments on commit 7aca9c8

Please sign in to comment.