1. V8 内联缓存(IC)如何加速属性访问,monomorphic/polymorphic/megamorphic 状态如何转换?
V8 内联缓存(IC)如何加速属性访问,monomorphic/polymorphic/megamorphic 状态如何转换?
- IC 通过缓存对象形状与属性偏移加速访问
- 状态机:monomorphic → polymorphic → megamorphic
- 形状(map)匹配驱动
V8 在属性访问点(obj.prop)插入内联缓存:首次访问时执行慢路径,查出对象的 map(隐藏类)与属性在内存中的偏移,并把该 (map, offset) 缓存到该访问点。后续访问若对象的 map 与缓存一致,就直接走快速路径用偏移取值,跳过查找。IC 状态是一个状态机:刚开始为空(uninitialized),记录一种形状后进入 monomorphic;当出现第二种不同形状时进入 polymorphic(内部有多个槽位,可容纳最多 4 种 map);当形状种类超过槽位上限时升级为 megamorphic,此时不再精确匹配,而是退回到通用的查找路径(或使用更通用的机制)。形状变化越多,IC 越难命中,性能越退化。
IC 的本质是"形状特异性的访问缓存":用 map 作为 key 缓存属性偏移,使访问从"查找属性表"退化为"比较 map + 取偏移"。状态机让 IC 在常见(单形状)场景下最快,在形状复杂时优雅降级,避免分支爆炸。