内联缓存(IC)深度绑定原型链结构,其性能由链的稳定性、深度和动态修改决定:链深超4层IC逐步失效,超6层退化为线性遍历;动态改原型或跨Realm传递对象均导致IC完全失效,高频场景下引发明显卡顿。

内联缓存(IC)不是独立于原型链运行的“加速插件”,而是深度绑定原型链结构的底层机制。它的性能表现,几乎完全由原型链是否稳定、是否过深、是否被动态修改所决定。
IC 依赖隐藏类匹配,而隐藏类由原型链结构定义
每次访问 obj.method(),V8 都会检查 obj 的隐藏类,并比对当前 IC 缓存中记录的类型。这个隐藏类不仅包含对象自身属性布局,还隐式编码了其整个原型链的结构快照——比如 obj.__proto__ 指向哪个对象、那个对象的 __proto__ 是否指向 Animal.prototype、再往上是不是 Object.prototype。只要链中任意一层被替换(如运行时执行 Pet.prototype = Object.create(Animal.prototype)),隐藏类就失效,IC 立即退化。
原型链每深一层,IC 命中难度就升一级
IC 不是“缓存一次,全链通用”。它缓存的是“从 obj 出发,查到 method 的完整路径”。链越长,路径越复杂,缓存特异性越强:
- 2 层链(obj → A.prototype):常见,IC 容易命中,偏移量查找极快
- 4 层链(obj → B.prototype → A.prototype → Object.prototype):IC 开始不稳定,部分调用点进入多态缓存状态
- 6 层及以上:V8 放弃 IC 优化,回落到慢速查找——逐层解引用 __proto__、读隐藏类、查属性表,实际变成近似线性遍历
动态改原型 = 主动清空 IC 缓存
以下操作看似轻量,实则触发全局 IC 失效:
立即学习“Java免费学习笔记(深入)”;
- Parent.prototype.newMethod = function(){}:Parent.prototype 隐藏类变更,所有继承自它的实例 IC 全部失效
- obj.__proto__ = newProto:单个对象原型被换,其后续所有属性/方法访问都走慢路径
- 跨 iframe 传递对象并调用其方法:不同 Realm 中的 Object.prototype 是不同对象,IC 完全无法复用,哪怕结构一模一样
高频场景下,IC 失效直接导致肉眼可见卡顿
在滚动、动画、输入响应等毫秒级敏感场景中,一个原本 20ns 的属性访问,因 IC 失效跳涨到 100–200ns,叠加数千次调用,就足以吃掉一帧(16ms)的大部分预算。尤其当 getter 或计算属性位于深层原型上时,JIT 很难优化,问题更突出。


















