var Arr1;
var Arr2 = [];
(假设Arr1以未定义的var开始,稍后根据需要变为数组。)
10亿Arr1的内存占用量是否与10亿Arr2相同?它们在技术上都是空的,但Arr2是一个对象,这意味着对象本身的定义必定有一些开销,对吗?
答案 0 :(得分:3)
TL; DR:大约90个字节。
我在Firefox和Chrome(Windows均为64位)上进行了一些测量。借助about:memory,Firefox更加精确,但是您在Chrome中获得的印象也很明显。 (在加载页面并等待其稳定后,我进行了几次测量,然后进行了最好的测量。)
我的测试文档仅包含一个文档类型和一个脚本块。
基线(无数组):
var x = [];
for (var i = 0; i < 0; i++) {
x.push([]);
}
Firefox:js领域内存使用量为0.60 MB。
Chrome浏览器:该标签页的内存占用为20880K。
一百万undefined
或null
s:(内存足迹相同)
var x = [];
for (var i = 0; i < 1000000; i++) {
x.push(undefined); // or x.push(null)
}
Firefox:js领域内存使用量为8.1 MB,其中class(Array)/ objects为8.00MB,全部为malloc-heap。 (这表明它为包含数组中的百万个索引分配了一个单词。)
Chrome浏览器:该标签页的内存占用为31,020K。 (听起来像每个undefined
大约10个字节。)
一百万个数组:
var x = [];
for (var i = 0; i < 1000000; i++) {
x.push([]);
}
Firefox:js领域内存使用量为99.65 MB,其中class(Array)/ objects为99.55 MB,其中91.55 MB为gc-heap和8.00 MB为malloc-heap。听起来每个空数组大约有96个字节(12个字)。
Chrome浏览器:该标签页的内存占用为116,164K。与Firefox大致相同的开销。
就这样:与使用[]
或undefined
相比,每个null
的开销大约为90字节。
答案 1 :(得分:2)
var Arr1
创建一个内存占用,其中包含对任何内容的引用。所以,是的,这是一个成本,但它是最小的。
但是,var Arr2 = []
创建一个内存地址,该地址持有对新Array对象的引用,因此那里有更多的足迹。即使数组为空,它也是Array
对象的唯一实例,它本身使用单个Array.proototype
继承。这是数组中真正占用内存的数量,因为即使是十亿个空数组也不必存储Array.prototype
尚未存储的任何内容。即使有十亿个空数组,它们都只从一个Array.prototype
对象继承,这就是存储数组的本机API的地方。