class CustomTarget {
constructor() {
this.listeners = {};
}
on(eventName, listener) {
if (!(eventName in this.listeners)) {
this.listeners[eventName] = new Set();
}
this.listeners[eventName].add(listener);
}
off(eventName, listener) {
this.listeners[eventName]?.delete(listener);
}
send(eventName, ...data) {
if (!this.listeners[eventName]) {
return 0;
}
for (let fn of this.listeners[eventName]) {
fn(...data);
}
return this.listeners[eventName].count;
}
}
const listeners = 10;
const events = 1000;
const setupCustom = () => {
const target = new CustomTarget();
let total = 0;
for (let i = 0; i < listeners; i++) {
target.on('foo', (inc) => { total = total + inc });
}
return () => {
for (let i = 0; i < events; i++) {
target.send('foo', 5);
}
}
}
const setupNative = () => {
const target = new EventTarget();
let total = 0;
for (let i = 0; i < listeners; i++) {
target.addEventListener('foo', (e) => { total = total + e.detail });
}
return () => {
for (let i = 0; i < events; i++) {
const customEvent = new CustomEvent('foo', { detail: 5 });
target.dispatchEvent(customEvent);
}
}
}
const runCustomInt = setupCustom();
const runNative = setupNative();
function runCustom() {
runCustomInt();
}