I-cache、代码膨胀与热代码布局
更新时间:2026-10-01。已有 i-cache,本文讲工程上代码“变多、变散”如何拖慢取指。
本文要回答的问题
- 为什么性能有时被代码大小/布局而非数据拖慢?
- 热代码该怎么排布?
一、指令侧压力
大量内联/模板展开、冷错误处理与热路径混排,会让热代码分散,超出 i-cache/uop cache,取指频繁停顿;巨大函数还增加 i-TLB 和前端带宽压力。
二、热冷分离
用 PGO(profile-guided optimization)把频繁执行的代码聚拢排布、冷路径外移,减小热足迹;避免无差别内联导致膨胀;关注前端停顿计数器而非只看数据 miss。
三、常见坑
- 只优化数据缓存,忽视前端取指。
- 过度内联/激进展开撑大代码。
- 不看 i-cache miss 与 uop cache 命中。
小结
指令也有缓存压力,代码膨胀和冷/热混排增加取指停顿;PGO 热冷分离与克制内联是主要对策。下一篇 缓存与多线程锁竞争。
总结
性能瓶颈不一定在数据:无节制的内联与模板展开把代码撑大,冷错误路径与热路径混排让热循环分散,超出 i-cache 和 uop cache 容量后取指频繁停顿,超大函数还会加重 i-TLB 和前端带宽压力;正解是用 PGO 按 profile 把热代码聚拢、冷路径外移,并克制无差别内联。前端取指和数据访存一样会饿——排查性能别只盯数据 miss,i-cache miss 与前端停顿计数器同样会说话。