UNPKG

causalityjs

Version:

A library for reactive programming based on Javascript proxies.

200 lines (164 loc) 4.21 kB
require('../causality').install(); var mobx = require('mobx'); const log = console.log.bind(console); log("Performance"); var amount = 100000; //var amount = 10; /******************************************************************/ // Plain var count = 0; function plain_reaction(obj){ count += obj.length; } console.time("plain"); var mylist = []; while( mylist.length < amount ){ var obj = { name: "Bert", birth: new Date(1980,5,5), hobby: ['causality', 'muffins'], }; mylist.push(obj); plain_reaction(obj.hobby); } for( let element of mylist ){ element.hobby.push('drapes'); plain_reaction(element.hobby); } console.timeEnd("plain"); log( count ); /******************************************************************/ // Proxy function createX(object) { return new Proxy(object, { getPrototypeOf : function(target) { //console.log("getPrototypeOf"); return Object.getPrototypeOf(target); }, setPrototypeOf : function(target, prototype) { console.log("setPrototypeOf"); Object.setPrototypeOf(target, prototype); }, isExtensible : function() { console.log("isExtensible"); }, preventExtensions : function() { console.log("preventExtensions"); }, apply : function() { console.log("apply"); }, construct : function() { console.log("construct"); }, get: function (target, key) { if( typeof key !== 'string' ){ return undefined; } //console.log("get " + key); return target[key]; // || undefined; }, set: function (target, key, value) { //console.log("set " + key); target[key] = value; plain_reaction( target ); /// SIMPLE REACTION TEST (runs twice per push ) return true; }, deleteProperty: function (target, key) { console.log("deleteProperty " + key); if (!(key in target)) { return false; } else { delete target[key]; return true; } }, ownKeys: function (target, key) { // Not inherited? //console.log("ownKeys"); var keys = Object.keys(target); let result = []; keys.forEach(function(key) { result.push(key); }); result.push('length'); return result; }, has: function (target, key) { console.log("has"); return key in target; }, defineProperty: function (target, key, oDesc) { console.log("defineProperty"); notifyChangeObservers("_enumerateObservers", target._enumerateObservers); return target; }, getOwnPropertyDescriptor: function (target, key) { //console.log("getOwnPropertyDescriptor"); return Object.getOwnPropertyDescriptor(target, key); } }); } console.time("proxy"); count = 0; mylist = []; while( mylist.length < amount ){ let obj = { name: "Bert", birth: new Date(1980,5,5), hobby: createX(['causality', 'muffins']), }; let xobj = createX(obj); mylist.push(xobj); plain_reaction(xobj.hobby); } for( let element of mylist ){ element.hobby.push('drapes'); } console.timeEnd("proxy"); log( count ); /******************************************************************/ console.time("causality"); count = 0; mylist = []; while( mylist.length < amount ){ let obj = { name: "Bert", birth: new Date(1980,5,5), hobby: create(['causality', 'muffins']), }; let xobj = create(obj); mylist.push(xobj); repeatOnChange(function(){ count += xobj.hobby.length; }); } for( let element of mylist ){ // console.time("element"); element.hobby.push('drapes'); // console.timeEnd("element"); } console.timeEnd("causality"); log( count ); /******************************************************************/ console.time("mobx"); count = 0; mylist = []; while( mylist.length < amount ){ let obj = { name: "Bert", birth: new Date(1980,5,5), hobby: ['causality', 'muffins'], }; let xobj = mobx.observable(obj); mylist.push(xobj); mobx.autorun(function(){ count += xobj.hobby.length; }); } for( let element of mylist ){ element.hobby.push('drapes'); } console.timeEnd("mobx"); log( count ); /******************************************************************/ //log( mylist );