Newer
Older
pixi.js / packages / runner / benchmark / index.js
/* 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`);