Script Preparation code:
AخA
 
data1 = {};
handler = {
  get: (target, prop) => (target[prop]),
  set: (target, prop, value) => (target[prop] = value),
};
proxy = new  Proxy(data1, handler);
data2 = {
  get test() {
    return this._test;
  },
  set test(value) {
    return this._test = value;
  }
};
const EVENTS = new WeakMap();
function pub(object, event, data) {
  if (!EVENTS.has(object)) { return; }
  const callbacks = EVENTS.get(object)[event];
  if (callbacks) {
    for (const callback of callbacks) {
      callback(data);
    }
  }
}
function sub(object, event, callback) {
  let dict;
  if (!EVENTS.has(object)) {
    EVENTS.set(object, dict={});
  } else {
    dict = EVENTS.get(object);
  }
  let evList;
  if (event in dict) {
    (evList = dict[event]).push(callback);
  } else {
    evList = dict[event] = [callback];
  }
  return function unsub() {
    evList.splice(evList.indexOf(callback), 1);
  }
}
data3 = {};
sub(data3, 'set-test', v => data3.test = v);
sub(data3, 'get-test', () => pub(data3, 'getting-test', data3.test));
sub(data3, 'getting-test', v => a += v);
var a = 0;
data4 = {};
data5 = {};
sub(data5, 'set-test', v => { data5.test = v; pub(data5, 'getting-test', data3.test); });
sub(data5, 'getting-test', v => a += v);
Tests:
  • getter / setter

     
    data2.test = Math.random();
    a += data2.test;
  • proxy

     
    proxy.test = Math.random();
    a += proxy.test;
  • events

     
    pub(data3, 'set-test', Math.random());
    pub(data3, 'get-test');
  • plain object

     
    data4.test = Math.random();
    a += data4.test;
  • events (kinda cheating)

     
    // note that is almost certainly not accurate since it probably ends after this function is called, not when getting-test triggers
    pub(data3, 'set-test', Math.random());
Rendered benchmark preparation results:

Suite status: <idle, ready to run>

Previous results

Experimental features:

  • Test case name Result
    getter / setter
    proxy
    events
    plain object
    events (kinda cheating)

    Fastest: N/A

    Slowest: N/A

Latest run results:
Run details: (Test run date: 12 days ago)
Mozilla/5.0 (X11; Linux x86_64; rv:136.0) Gecko/20100101 Firefox/136.0
Firefox 136 on Linux
View result in a separate tab
Test name Executions per second
getter / setter 378371552.0 Ops/sec
proxy 17582520.0 Ops/sec
events 8451159.0 Ops/sec
plain object 428359424.0 Ops/sec
events (kinda cheating) 23594872.0 Ops/sec