Efficient JavaScript Delta-encoding (v13)

Revision 13 of this benchmark created on


Preparation HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.2.1/lodash.min.js"></script>
<script>
var lodash = _.noConflict();
</script>
<script>
var Entity = function() {};

Entity.defaults = {
        id: 'ID',
        type: 'player',
        position: [0, 0],
        velocity: [0, 0],
        acceleration: [1, 1],
        thrust: 10,
        angle: Math.PI
};

Entity.merge = function(obj1, obj2) {
        var cons = obj1.constructor,
                func = cons._mergeFunc, props, p, i;

        // Create the merge function if one isn't already defined
        if(!func) {
                func = '';

                // Loop over the first objects default properties and merge obj2's values
                if((props = cons.defaults)) {
                        for(p in props) {
                                func += 'if(typeof obj2.'+p+' !== "undefined") {' +
                                        'obj.'+p+' = obj2.'+p+';' +
                                '} ';
                                
                        }
                }

                // Create and store the new function
                func = cons._mergeFunc = new Function('obj', 'obj2', func);
        }

        // Run the merge function and return the first object
        return func(obj1, obj2), obj1;
};

Entity.mergeLoop = function(obj, obj2) {
        var props = obj.constructor.defaults;

        for(p in props) {
                if(obj2[p] !== undefined) {
                        obj[p] = obj2[p];
                }
        }
}
</script>

Setup

var obj = new Entity();
    
    var deltaState = {
        position: [4,1],
        velocity: [1,2],
        angle: Math.PI / 2
    }

Test runner

Ready to run.

Testing in
TestOps/sec
Dynamic-method merge
Entity.merge(obj, deltaState);
ready
Iterative merge
Entity.mergeLoop(obj, deltaState);
ready
lodash merge/extend
lodash.extend(obj, deltaState);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.