Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] events: use Map for events and limit copying #17074

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
11 changes: 9 additions & 2 deletions doc/api/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -344,16 +344,23 @@ added: v3.2.0

Returns the number of listeners listening to the event named `eventName`.

### emitter.listeners(eventName)
### emitter.listeners(eventName[, unwrap])
<!-- YAML
added: v0.1.26
changes:
- version: v7.0.0
pr-url: https://github.com/nodejs/node/pull/6881
description: For listeners attached using `.once()` this returns the
original listeners instead of wrapper functions now.
- version: REPLACEME
pr-url: REPLACEME
description: Second optional argument `unwrap` allows the wrapped
listeners to be returned (such as ones created with
`.once()`)
-->
- `eventName` {any}
* `eventName` {any} The name of the event.
* `unwrap` {boolean} When set to true, will return the original listeners
instead of the wrapper functions created by `.once()`. **Default:** `true`

Returns a copy of the array of listeners for the event named `eventName`.

Expand Down
16 changes: 16 additions & 0 deletions lib/domain.js
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ class Domain extends EventEmitter {

this.members = [];
asyncHook.enable();

this.on('newListener', setHasErrorListener);
this.on('removeListener', removeHasErrorListener);
}
}

Expand All @@ -105,6 +108,19 @@ exports.create = exports.createDomain = function() {

// the active domain is always the one that we're currently in.
exports.active = null;

function setHasErrorListener(type) {
if (type === 'error')
this._hasErrorListener = true;
}

function removeHasErrorListener(type) {
if (type === 'error' && !this.listenerCount('error'))
this._hasErrorListener = false;
}

Domain.prototype._hasErrorListener = false;

Domain.prototype.members = undefined;

// Called by process._fatalException in case an error was thrown.
Expand Down
Loading