隐藏类和内联缓存
隐藏类
JS是动态语言,在运行的过程中可能会修改对象,比如:
js
const o = {a: 1, b: 2}
function run() {
o.c = 3
}
run()在运行的过程中添加了一个c属性,修改了对象。
V8在后续的查找对象属性的过程,会按照对象属性来查找,很耗时,为了提升效率,就借鉴静态语言的特性,引入了隐藏类。
简单来说,隐藏类就是对对象形状的一种描述,后续查找会直接从隐藏类中找到对应属性。
隐藏类中记录了两个信息:
- 对象中包含的所有属性
- 属性相对于对象的内存偏移量
有了隐藏类,查找对象属性时,就会直接从隐藏类中找到属性相对于对象的偏移量,然后从内存中读取属性值。
有一些注意点:
- 多个相同的对象(声明的顺序、属性个数和名称都相同)会共用一个隐藏类
- 对象修改之后会重新创建隐藏类
内联缓存Inline Cache
如果多次重复读取对象属性,可以通过内联缓存来优化。
当函数执行时,会在读取对象属性和返回值时,将一些数据写入一个表格(反馈向量)中,反馈向量中缓存了一些临时数据包括偏移量、隐藏类等等。通过这个缓存就不用重复读取隐藏类,可以减少重复。
注意
需要注意的是,隐藏类和内联缓存对于效率提升比起其他的性能问题还是微不足道的,不需要过度关注这种微优化,只需要知道有这个内部的优化即可。