【问题标题】:Memory Size: What's Smallest Between String or Array内存大小:字符串或数组之间最小的是什么
【发布时间】:2014-02-05 19:37:06
【问题描述】:
    var string = '';
    var array = [];

    for(var i = 0; i < 10000; i++){
        string += '0';
        array.push(0);
    }

哪个会更小?两者之间的断点何时/何地?

注意:数字始终为 1 位。

创建数组比创建字符串快约 50%。

【问题讨论】:

  • 我相信这在很大程度上是特定于实现(浏览器)的。
  • 它有什么关系? :)
  • 断点是什么意思?
  • 我的意思是,人类能够检测到差异
  • 一个拥有 javascript 分析器的人类?

标签: javascript arrays string memory


【解决方案1】:

要将小数字存储在数组中,最好的方法是使用 Int8Array。
(https://developer.mozilla.org/en-US/docs/Web/API/Int8Array)。

【讨论】:

    【解决方案2】:

    基于answer here,可以粗略计算出JavaScript中不同数据类型的大小。

    使用与您的问题直接相关的公式来计算字节大小:

    string = string.length * 2
    number = 8
    

    基于此,array 变量的大小将取决于放置在其中的内容类型。当您插入数值时,每个偏移量将是 8 个字节,所以:

    array[number] = array.length * 8
    

    根据这些等式,大小为:

    string = 20000
     array = 80000
    

    如果您要改用array.push('0')(即使用字符串),stringarray 的大小应该大致相等。

    参考资料:

    1. The String Type - EMCAScript Language Specification:

      String 类型是零个或多个 16 位无符号整数值的所有有限有序序列的集合。

    2. The Number Type - EMCAScript Language Specification:

      Number 类型正好有 18437736874454810627(即 264−253+3)个值,代表二进制浮点算术的 IEEE 标准中指定的双精度 64 位格式 IEEE 754 值

    【讨论】:

    • 实际上,单个大字符串应该比单个字符串数组使用更少的内存。
    【解决方案3】:

    数组总是更快。

    对于字符串,每次追加时,运行时都要为新字符串分配空间,然后丢弃最后一个版本的字符串。

    使用数组,它只是扩展了一个链表。

    http://en.wikipedia.org/wiki/Linked_list

    另一方面,字符串可能会消耗更少的内存,因为所有数据都将位于单个连续的 RAM 块中,而数组也将包含数据和所有链表指针。

    【讨论】:

    • 我怀疑大多数 Javascript 实现会使用链表来实现数组,因为它们需要提供索引访问,这与链表具有线性复杂性。我宁愿期望他们使用哈希表或二叉树。
    • 是的,数组是使用链表实现的证据在哪里?听起来像是我的猜测。
    • 集合的具体实现可能会有所不同,这是真的。但无论如何,添加到集合通常比添加字符串要快。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2019-12-10
    • 1970-01-01
    相关资源
    最近更新 更多