/* eslint-disable no-console, func-names */
const { Runner } = require('../');
const Signal = require('signals');
const MiniSignal = require('mini-signals');
const EventEmitter = require('eventemitter3');
const updateRunner = new Runner('update');
const updateRunnerAdhoc = new Runner('update');
const updateSignal = new Signal();
const updateMiniSignal = new MiniSignal();
const updateEvent = new EventEmitter();
const numListeners = 10;
const numCycles = 2000;
const numRuns = 100;
const timings = {};
function Listener()
{
this.time = 0;
}
Listener.prototype.update = function ()
{
this.time++;
};
for (let i = 0; i < numListeners; i++)
{
const listener = new Listener();
updateRunner.add(listener);
updateRunnerAdhoc.add({ time: 0, update: Listener.prototype.update });
updateSignal.add(listener.update, listener);
updateMiniSignal.add(listener.update, listener);
updateEvent.on('update', listener.update, listener);
}
// bench helper
function doBench(name, fn)
{
timings[name] = {
runs: [],
total: 0,
avg: 0,
};
console.log(`\nbenchmarking ${name}...`);
for (let r = 0; r < numRuns; ++r)
{
const start = performance.now();
for (let i = 0; i < numCycles; i++)
{
fn();
}
let time = performance.now() - start;
time /= 1000;
timings[name].runs.push(time);
timings[name].total += time;
}
timings[name].avg = timings[name].total / numRuns;
console.log(`${name}: ${timings[name].avg}`);
}
log(`Number of listeners: ${numListeners}`);
log(`Number of runs each: ${numRuns}`);
log(`Number of cycles per run: ${numCycles}`);
// ///// SIGNALS ///////
doBench('signals', function ()
{
updateSignal.dispatch();
});
// ///// MINI-SIGNALS ///////
doBench('miniSignals', function ()
{
updateMiniSignal.dispatch();
});
// ///// EVENTS ///////
doBench('events', function ()
{
updateEvent.emit('update');
});
// ////// RUNNER ///////
doBench('runner', function ()
{
updateRunner.emit();
});
// ////// RUNNER ADHOC ///////
doBench('runnerAdHoc', function ()
{
updateRunnerAdhoc.emit();
});
// ////// RESULTS ///////
console.log('\n');
function log(msg)
{
console.log(msg);
/* jshint ignore:start */
document.write(`<pre>${msg}</pre>`);
/* jshint ignore:end */
}
log(`mini-runner is ${timings.signals.avg / timings.runner.avg}x faster than signals`);
log(`mini-runner is ${timings.miniSignals.avg / timings.runner.avg}x faster than mini-signals`);
log(`mini-runner is ${timings.events.avg / timings.runner.avg}x faster than events`);
log('\n');
log(`mini-runner (adhoc) is ${timings.signals.avg / timings.runnerAdHoc.avg}x faster than signals`);
log(`mini-runner (adhoc) is ${timings.miniSignals.avg / timings.runnerAdHoc.avg}x faster than mini-signals`);
log(`mini-runner (adhoc) is ${timings.events.avg / timings.runnerAdHoc.avg}x faster than events`);