1

我是使用 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。谢谢,

4

1 回答 1

1

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

但是,对于更多的键,使用哈希表更有效。哈希表中的查找是常数时间 ( O(1)),但这个常数时间是不平凡的。

我的猜测是,Chrome 中的 V8 JavaScript 引擎会在这两种设置之间切换,这取决于它认为哪个更有效,而您只是找到了此切换的阈值。

于 2013-11-10T10:13:05.903 回答