【问题标题】:In terms of memory usage, what is the difference between these two arrays in javascript?在内存使用方面,javascript中这两个数组有什么区别?
【发布时间】:2017-06-06 22:52:48
【问题描述】:

这里我有一个数组,其中的元素的索引以 1 为增量分隔。

let noGap = [];
noGap[0] = 0;
noGap[1] = 1;

这里我有一个不同的数组,其索引由远大于 1 的索引分隔。

let gap = [];
gap[0] = 0;
gap[1000] = 1;

每个变量(noGap vs gap)使用多少内存有什么区别?我可以从 Chrome 控制台日志中看到 gap 的长度更大,因为它记录了 (1001) [0, undefined × 999, 1]

但是如果gap 变量确实使用了更多空间,我很想知道它是否与数组中存在的undefined 的数量成比例,或者它是否是常数。

如果这是重复的问题,请原谅我。这是我找到的closest answer,但我无法完全理解答案。

【问题讨论】:

  • "...因为那里有 999 个'未定义'"。不,没有。有两个成员,长度为 1001。
  • 真的取决于JS引擎和这段代码运行的次数——见热点优化/优化编译器。第二个带孔的数组可能会由具有一定开销的哈希表支持,而第一个将存储为紧凑的 32 位有符号整数数组。两者都执行预分配。
  • Internet Exploder 显示 0 然后 999 个实际 undefined 值然后 1 - firefox 显示 0, 999 empty slots, 1,chrome 显示 0, 999 x undefined, 1(这是 chrome 显示空插槽的方式吗?) - 所以。 ..你指的是哪个浏览器
  • 谢谢大家。我用铬。为了清楚起见,编辑了我的帖子。还要感谢@TommyMay,我知道我可能错过了之前的某个帖子。

标签: javascript arrays memory undefined


【解决方案1】:

在 V8 中有很大的不同,长而稀疏的数组占用更多的内存。 但是,这部分是因为 1000 接近边界,之后 V8 改变了其稀疏数组的内部表示。 更长的稀疏数组可能会占用相似数量的内存。

我只用 Chrome 开发工具收集了一点证据(查看内存选项卡),但它就是这样。此表中的每一行都是一个数组,其索引为 0 处有一个条目,末尾还有一个条目来定义其长度。

| sparse array length | retained size |
|---------------------|---------------|
| 1                   | 56            |
| 10                  | 304           |
| 1000                | 12,184        |
| 2000                | 184           |
| 3000                | 184           |
| 3000, less sparse   | 472           |

请注意,内存的长度可扩展到 1000,但在 2000 时要小得多,而是随设置索引的数量而扩展。

假设这是因为 V8 正在从索引 0length(在长度为 1000 的情况下)的所有值的完整表示切换到哈希映射,其中只有已设置的索引条目。

我不知道这实际上是如何工作的,仅供参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2021-12-15
    • 2011-02-20
    • 2012-04-01
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多