Dictionaries - Part 1 - Add

JavaScript performance comparison

Test case created by Andrew Nurse

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    function KeyedCollection(keyExtractor) {
        var items = [];
        var table = {};
       
        this.add = function(item) {
            var index = items.length;
            var key = keyExtractor(item);
            items.push(item);
            table[key] = { index: index, value: item };
        }
   
        this.delete = function(key) {
            var node = table[key];
            items.splice(node.index, 1);
            delete table[key];
        }
   
        this.get = function(key) {
            return table[key].value;
        }
   
        this.all = function() {
            return items;
        }
    };
   
    function ObjectMap(keyExtractor) {
        var table = {};
   
        this.add = function(item) {
            var key = keyExtractor(item);
            table[key] = item;
        }
   
        this.delete = function(key) {
            delete table[key];
        }
   
        this.get = function(key) {
            return table[key];
        }
   
        this.all = function() {
            var arr = [];
            for(var key in table) {
                if(table.hasOwnProperty(key)) {
                    arr.push(table[key]);
                }
            }
            return arr;
        }
    }
   
    function Map() {
        this._table = {}
    }
    Map.prototype.add = function(key, item) {
        this._table[key] = item;
    }
   
    Map.prototype.delete = function(key) {
        delete this._table[key];
    }
   
    Map.prototype.get = function(key) {
        return this._table[key];
    }
   
    Map.prototype.all = function() {
        var arr = [];
        for(var key in this._table) {
            if(this._table.hasOwnProperty(key)) {
                arr.push(this._table[key]);
            }
        }
        return arr;
    }
   
    function AutoKeyMap(keyExtractor) {
        this._table = {}
        this._keyExtractor = keyExtractor;
    }
    AutoKeyMap.prototype.add = function(item) {
        var key = this._keyExtractor(item);
        this._table[key] = item;
    }
   
    AutoKeyMap.prototype.delete = function(key) {
        delete this._table[key];
    }
   
    AutoKeyMap.prototype.get = function(key) {
        return this._table[key];
    }
   
    AutoKeyMap.prototype.all = function() {
        var arr = [];
        for(var key in table) {
            if(this._table.hasOwnProperty(key)) {
                arr.push(this._table[key]);
            }
        }
        return arr;
    }
   
    function Item(name, value) {
        this.name = name;
        this.value = value;
    }
    Item.getKey = function(item) { return item.name; }
   
    var kc = new KeyedCollection(Item.getKey);
    var om = new ObjectMap(Item.getKey);
    var map = new Map();
    var akm = new AutoKeyMap(Item.getKey);
    var obj = {};
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
KeyedCollection
for(var i = 0; i < 1000; i++) {
    kc.add(new Item('k' + i, i));
}
pending…
ObjectMap
for(var i = 0; i < 1000; i++) {
    om.add(new Item('k' + i, i));
}
pending…
Map
for(var i = 0; i < 1000; i++) {
    var key = 'k' + i;
    map.add(key, new Item(key, i));
}
pending…
AutoKeyMap
for(var i = 0; i < 1000; i++) {
    akm.add(new Item('k' + i, i));
}
pending…
Object
for(var i = 0; i < 1000; i++) {
    var key = 'k' + i;
    obj[key] = new Item(key, i);
}
pending…

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

Compare results of other browsers

0 comments

Add a comment