这里我有一个数组,其元素的索引以1的增量分隔。
let noGap = [];
noGap[0] = 0;
noGap[1] = 1;
这里我有一个不同的数组,其索引由远大于1的索引分隔。
let gap = [];
gap[0] = 0;
gap[1000] = 1;
每个变量(noGap
与gap
)使用的内存量有多大差异?我可以在Chrome控制台日志中看到gap
的长度更长,因为它会记录(1001) [0, undefined × 999, 1]
。
但如果 gap
变量确实占用了更多空间,我有兴趣知道它是否与存在的undefined
数量成比例在数组中或它是否恒定。
如果这是重复的问题,请原谅我。这是我发现的closest answer,但我无法完全理解答案。
答案 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正在从索引0
到length
的所有值的完整表示(在长度为1000的情况下)切换到一个哈希映射,它只包含已设置索引的条目。
我对这实际上是如何运作没有正式的了解,仅供参考。