【问题标题】:JavaScript: memory/efficiency of associative arrays?JavaScript:关联数组的内存/效率?
【发布时间】:2012-01-11 17:23:36
【问题描述】:

我正在用关联数组构建一个树状数据结构。每个键为 1-2 个字符。键对于它们各自的级别是唯一的。根级别上的键不超过 40 个,树的每个后续级别上的键不超过 5 个。它可能看起来像这样:

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

最初,我认为用这么少的键(平均

//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 的数组有时会在稀疏填充时实现为关联数组,这可能违背了创建自己的哈希结构的目的。但我不确定。那么,就内存和速度而言,哪个效率更高?

【问题讨论】:

  • 无法弄清楚您要做什么。你能提供更多信息吗?你用这棵树建模什么?
  • 归根结底,数组也只是对象。
  • 您有没有尝试过一种方法并发现它很慢,或者您只是在猜测?
  • 我主要是在推测:如果 JavaScript 对象(内部)是哈希映射,属性是它们的键,那么每个对象都需要一个 180 多行的数组。由于每个哈希映射实际上只需要 6 行(平均),我认为原始实现可能更有效。然而,我认为 JS 对象实际上并不是哈希结构,而是可以动态添加/删除属性的东西。如果有人可以确认/反驳/解释这一点,它将回答我的问题。

标签: javascript performance memory associative-array


【解决方案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/

【讨论】:

    【解决方案2】:

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

    [...] 用这么少的键创建这么多对象(平均而言,

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

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 2014-05-04
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2012-09-22
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多