空数组与未定义var的内存开销?

时间:2017-05-27 22:05:44

标签: javascript memory

var Arr1;
var Arr2 = [];

(假设Arr1以未定义的var开始,稍后根据需要变为数组。)

10亿Arr1的内存占用量是否与10亿Arr2相同?它们在技术上都是空的,但Arr2是一个对象,这意味着对象本身的定义必定有一些开销,对吗?

2 个答案:

答案 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。

  • 一百万undefinednull 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的地方。