JavaScript:关联数组的内存/效率?

时间:2011-12-02 17:49:04

标签: javascript performance memory associative-array

我正在使用关联数组构建树状数据结构。每个键为1-2个字符。钥匙是各自级别的独特之处。根级别上的密钥不超过40个,并且树的每个后续级别上的密钥不超过5个。它可能看起来像这样:

{a:{b:null,c:null},de:{f:{g:null}},h:null,i:null,j:null,k:null}

最初,我认为用如此少的键创建如此多的对象(平均而言,< 3)将是效率低下且内存密集的。在这种情况下,我会像我这样实现自己的哈希表:

//Suppose keys is a multi-dimensional array [[key,data],...]
var hash = function(keys){
    var max = keys.length*3, tbl = [];
    //Get key hash value
    var code = function(key){
        return (key.charCodeAt(0)*31)%max;
    }
    //Get key values
    this.get(key){
        //2 character keys actually have a separate hash generation algorithm...
        //we'll ignore them for now
        var map = code(key), i=map;
        //Find the key value
        while(true){
            if (typeof tbl[i] == 'undefined') return false;
            if (code(tbl[i][0]) == map && tbl[i][0] == key) return tbl[i][1];
            else i = (i+1)%max;
        }
    }

    //Instantiate the class
    for (var i=0; i<keys.length; i++){
        var index = code(keys[i][0]);
        while(typeof tbl[index] != 'undefined')
            index = (index+1)%max;
        tbl[index] = keys[i];
    }
}

然后,我在某处读到JavaScript的数组有时在稀疏填充时被实现为关联数组,可能无法创建自己的哈希结构。但我不确定。那么,在内存和速度方面哪个更有效呢?

2 个答案:

答案 0 :(得分:1)

阅读这篇文章:http://mrale.ph/blog/2011/11/05/the-trap-of-the-performance-sweet-spot.html

基本上由于JavaScript的动态特性,您的数据结构效率不高。如果确实需要非常高效的数据结构,则应尝试使用最近推出的新型数组。

如果您没有理论结果,Resig已经在不同类型的树上进行了真正的单词性能测试,查看数据大小和性能解析和处理:http://ejohn.org/blog/javascript-trie-performance-analysis/

答案 1 :(得分:0)

你的解决方案,如果我理解正确,肯定会表现得更糟。你对此表示担忧:

  

[...]用如此少的键创建如此多的对象(平均而言,<3)[...]

但你的解决方案正在做同样的事情。每个嵌套的哈希值仍然是一个具有少量键的对象,现在只有一些键是一个名为get的闭包(它将具有更高的内存需求,因为它隐式关闭了诸如{之类的变量。 {1}}和tbl,其中code是另一个闭包......。)。