cpu 的 cache 是很宝贵的——从互相平行的数组看
以前一直想不通,为什么在有些系统中,要把同一个数据结构的不同字段放入 多个互相平行的数组中,而不是放入一个结构中。
典型的如Windows PE 可执行文件的导入表,有 IAT (导入地址表)和 INT(导入名字表),这两个表就放在两个互相平行的数组中,而按照我们的第一感觉,好像这样的设计纯粹是玩弄我们的大脑,没有任何别的益处。其实仔细想想,这样的益处是很大的,在Windows 从 INT 载入 IAT 以后,INT 就几乎永远用不着了,而 IAT 使用得非常频繁,这样,CPU 就会把 IAT 载入 cache,如果把 INT 和 IAT 分离(两个平行的数组),CPU 载入 IAT 时就不会连 INT 也载入了。而如果不分离(INT和IAT中每项合并起来放入一个结构),CPU载入IAT时,因为没有用的 INT 项目在物理位置上(地址)和IAT的相应项目是相邻的,所以就连 INT 也一起载入了,这样就多浪费了一倍的 CPU cache。
在很多性能敏感的应用或系统中,这样的设计是很必要的,往往提高好几倍的性能。