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