【问题标题】:High performance JS map for int-string pairs用于 int-string 对的高性能 JS 映射
【发布时间】:2012-10-25 09:56:28
【问题描述】:

我需要一个高性能的 Javascript 映射(哈希映射或其他),将 int(s) 映射到 string(s)。在 dom 准备好后,该地图将用于构建网页的某些部分。我知道简单的 javascript 对象也可以像地图一样工作,但我需要以最佳性能工作。

我想在从服务器生成响应页面的同时,通过在网页上附加一个字符串来一次用所有数据对初始化地图。

有什么方法可以提高整数字符串对的 javascript 映射的性能,或者是否有相同的实现?

--

使用 jQuery 1.7

【问题讨论】:

  • 使用数组。考虑到任何实现都必须使用 js 基元和对象,您将很难找到比这更高效的东西。
  • 如果需要,大多数 js 实现中的数组也会自动切换到稀疏实现
  • @soulcheck:数组会很棒,但整数键的范围可能从 0 到 Integer.MAX_VALUE(32 位)。因此,例如,如果我将某些东西存储在像这样的 array1[23465435] 这样的数组中,它会创建这么长的数组吗!?我需要存储不超过 100-200 个条目,但使用的 int 键可能分散在整个 Integer 范围内。
  • 整数有时甚至可能是负数。在那种情况下,数组会有帮助吗?
  • 大多数(全部?)javascript 实现中的数组可能是稀疏的。所以array.length 将返回最后一个元素的索引 + 1,但在稀疏情况下,数组不会分配所有元素,并将使用对象属性语义来访问它的元素(意思是,它实际上是一个以整数作为键的哈希表)。它基本上为您提供了您正在寻找的行为。如果是负整数,请使用第二个数组;)

标签: javascript jquery dictionary


【解决方案1】:

好的,我会在这里发布,因为它更像是一个答案:

使用数组。考虑到任何实现都必须使用 js 基元和对象,您将很难找到比这更高效的东西。

大多数(全部?)javascript 实现中的数组可能是稀疏的。因此 array.length 将返回最后一个元素的索引 + 1,但在稀疏情况下,数组不会分配所有元素,并且将使用对象属性语义来访问它的元素(意思是,它实际上是一个以整数作为键的哈希表)。

它基本上为您提供了您正在寻找的行为。

如果是负整数,请使用第二个数组。

关于单个语句的初始化:一般情况下你不能这样做,因为它基于隐式知道项目索引。

你可以做的是沿着线附加一些东西:

 var arr = [];

 arr[int1] = val1;
 arr[int2] = val2;
 arr[int3] = val3;
 arr[int4] = val4;
 ...
 arr[intn] = valn;

我的意思是你必须以某种方式列出 (Number, String) 对。

【讨论】:

    【解决方案2】:

    请查看this jperf 测试用例,并得出你的结论。 对象也是稀疏的。数组只是特殊的对象,除了其他东西之外,它们也占了自己的长度。

    【讨论】:

      【解决方案3】:

      我认为你应该使用以下 var l_map = {};

      添加元素使用 l_map[<your integer>] = <your string>

      并且要检索的是 var l_value = l_map[<your integer>];

      这是解决问题的一种方法。

      第二种方法非常简单,只需使用数组(或列表),因为它根据位置存储值,如下所示: var l_array = [];

      在最后一次使用时添加元素:l_array.push(<your string>); 在指定位置添加元素:l_array.splice(<position>,0,<your string>);

      并检索使用:l_array[<posit>];

      【讨论】:

        猜你喜欢
        • 2011-04-24
        • 2023-02-07
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多