V8

var shishi = {
    15:'xxx',
    test1:'lishishi2',
    test3:'33333'
}
shishi['test2'] = 'xxxx'
for(let i=0;i<19;i++){
    shishi['p'+i] = 1
}
window.alishishi = shishi
console.log('最初的样子',%DebugPrint(shishi));
node --allow-natives-syntax demo2.js //控制执行,可以打印V8对象信息

 

map对应DictionaryProperties是字典   properties是NameDictionary  这个对象shishi就是慢对象,注意浏览器可以使用memory收集来观测window/file上观察

map对应fastProperties  properties是propertyArray 快对象  做了优化没有突破v8限制(添加属性的数量)即便是添加属性的时候她仍然是propertyArray 

 v8对象的inobject elements是快属性,properties是慢属性,不完全是只有突破v8 限制的时候才会变成 NameDictionary

慢对象是读取慢,但是更改快,快对象是读和修改都快     

快数组 FixedArray 慢数组 HashTable

快数组可以扩容,扩容到原来数组3倍后就变成慢数组

索引差了1024会导致快数组直接变为慢数组

慢数组想变成快数组:1.慢数组可以放到即将申请的快数组中2.对于新数组而言操作节省50%的空间

元素能存放在快数组中并且长度不在smi之间(64位-2^31到2^32-1),并且当前慢数组空间相比快数组节省值小于等于50%,则转变成为快数组。

扩容

 

数组扩容公式为 原内存空间长度的1.5 + 16

const arr = [1, 2, 3, 4];

arr.push(5);

%DebugPrint(arr);

缩容

 

当数组元素减少(如 pop)后,如果数组容量大于等于 length 的 2 倍,则进行容量调整,使用 RightTrimFixedArray 函数,计算出需要释放的空间大小,做好标记,等待 GC 回收;如果数组容量小于 length 的 2 倍,则用 holes 对象填充。

 

测试日期为20220308

posted @ 2022-03-08 14:46  国服第一李师师  阅读(304)  评论(0编辑  收藏  举报