保留大小的Javascript对象充满了布尔

时间:2013-06-17 00:42:49

标签: javascript memory-management google-chrome-devtools

我是使用Chrome的分析器的新手。所以这可能是对我得到的结果的误解。

如果我打开Chromes探查器并获取以下网页的堆快照,我注意到obj3的保留大小是obj1和obj2的十倍以上。

<html>
<head>
</head>
<body>
    <script>

        // return an object with s keys, with values alternating true and false
        var makeData = function (s) {
            var o = {};
            for (var i = 0; i < s; i++) {
                o['data' + i] = !!(i % 2);
            }
            return o;
        }

        window.obj1 = makeData(14);
        window.obj2 = makeData(15);

        window.obj3 = makeData(16);
        window.obj4 = makeData(17);
        window.obj5 = makeData(18);


    </script>
</body>
</html>

看起来包含布尔值少于15个字段的对象的保留大小始终为80,但更多16个字段的保留大小为828,17个为848,18个为868,等等... 我很好奇这里发生了什么?

如果重要,我在运行10.6的macbook上使用Chome版本27.0.1453.110。 谢谢,

1 个答案:

答案 0 :(得分:1)

JavaScript中的对象是地图。在引擎盖下存储此结构的最简单方法是键/值对列表 - 要搜索/更新,您遍历所有它们以查找匹配项。查找的计算成本显然与您拥有的键/值对的数量成比例(O(n)),但是当您拥有少量键/值对时,这是可以的。

但是,对于更多数量的密钥,使用hash table更有效。哈希表中的查找是常量时间(O(1)),但这个常量时间并不重要。

我的猜测是Chrome中的V8 JavaScript引擎在这两种设置之间进行切换,具体取决于它认为效率更高的设置,并且您只需找到此切换的阈值。