在内存使用方面,这两个数组在javascript中有什么区别?

时间:2017-06-06 22:52:48

标签: javascript arrays memory undefined

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

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

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

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

每个变量(noGapgap)使用的内存量有多大差异?我可以在Chrome控制台日志中看到gap的长度更长,因为它会记录(1001) [0, undefined × 999, 1]

如果 gap变量确实占用了更多空间,我有兴趣知道它是否与存在的undefined数量成比例在数组中或它是否恒定。

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

1 个答案:

答案 0 :(得分:0)

在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的情况下)切换到一个哈希映射,它只包含已设置索引的条目。

我对这实际上是如何运作没有正式的了解,仅供参考。