内联缓存(ic)仅优化对象属性读取,不加速await或promise流转;需确保异步函数内高频访问的参数、配置等对象形状一致,统一构造、避免动态增删属性、保持访问语法统一,并收敛promise返回值结构以稳定命中ic。

内联缓存(Inline Cache, IC)本身不直接作用于异步函数的 await 或 Promise 状态流转,它只优化**对象属性读取**这一具体操作。所以“利用 IC 设计高性能异步处理函数”的核心,不是让 await 变快,而是确保异步函数内部高频访问的对象属性——比如参数对象、上下文、配置项、结果 payload——能稳定命中 IC,避免因属性访问退化拖慢整体执行。
保持参数对象形状高度一致
异步函数常接收 config、options、payload 等对象参数。若这些对象来自不同构造路径或动态拼接,HiddenClass 就会分裂,IC 失效。
- 用 class 或工厂函数统一创建参数对象,初始化顺序和字段完全固定
- 避免在调用前临时增删属性:
options.timeout = 5000会触发 HiddenClass 迁移 - 不要混用字面量与 class 实例:
{url, method}和new RequestOptions(...)即使字段相同,HiddenClass 也不同
属性访问必须“三同”:同对象类型、同属性名、同语法形式
哪怕只是在一个 async 函数里,也要守住这三条线:
- 所有
obj.x访问必须针对同一类对象(如全是RequestData实例) - 属性名不能是计算得出的:
obj[condition ? 'id' : 'uid']或obj[key]会绕过 IC,走慢路径 lookup - 禁止混用点号与方括号:
req.url后再写req['method'],V8 会为这两者维护不同 IC 槽位,相互污染
避免在热异步路径中触发 IC 不友好操作
以下行为在 async 函数体或其频繁调用的 helper 中尤其危险:
- 使用
for...in遍历传入对象并读取属性(IC 不覆盖枚举场景) - 对同一对象反复调用
Object.keys()、Object.getOwnPropertyNames()—— 触发全量隐藏类扫描,阻塞 IC 更新 - 给对象定义 getter:
Object.defineProperty(obj, 'data', { get() { ... } }),IC 对 getter 完全失效,每次访问都走完整代理链 - 把对象传给多个异步辅助函数,而每个函数访问的字段不一致(V8 按函数粒度维护 IC 表,字段不一致 → 多个低效 IC)
配合 Promise 链做结构收敛
虽然 IC 不管 then 或 await 本身,但你可以让 Promise resolve 的值尽早收敛为稳定结构:
- 不用
return res.json()原始响应(可能含不可控字段),而是显式构造标准对象:return { code: res.status, data: await res.json() } - 在
async函数开头就解构并赋给局部常量:const { id, token, timeout } = options;,后续只读局部变量,彻底避开对象访问开销 - 对高频使用的嵌套字段,提前扁平化:
const userId = user.profile?.id || user.id;改为构造时就保证user.userId存在且类型一致










