我是使用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。 谢谢,
答案 0 :(得分:1)
JavaScript中的对象是地图。在引擎盖下存储此结构的最简单方法是键/值对列表 - 要搜索/更新,您遍历所有它们以查找匹配项。查找的计算成本显然与您拥有的键/值对的数量成比例(O(n)
),但是当您拥有少量键/值对时,这是可以的。
但是,对于更多数量的密钥,使用hash table更有效。哈希表中的查找是常量时间(O(1)
),但这个常量时间并不重要。
我的猜测是Chrome中的V8 JavaScript引擎在这两种设置之间进行切换,具体取决于它认为效率更高的设置,并且您只需找到此切换的阈值。