1. cacheline对齐
避免读取的数据跨越2个cacheline,结构体可以cacheline对齐,连续的数组可以尝试首地址cacheline对齐,但可能造成浪费。
2. 分支预测
可以使用likely/unlikely这样的宏,提高cacheline命中的概率。
存在多个条件判断时,根据几率调整每个分支的顺序。
3. 延迟计算
最近用不到的变量不要进行初始化,和编程规范可能相背。
4. 寄存器参数
尽量使用寄存器作为函数参数。
5. 相关代码相邻
相关的代码或文件尽量相邻,相关的代码编译到一起,提高cache的命中率。
6. 代码冗余
减少冗余代码与死代码。
7. 读写分离
两个无关的变量,一个读,一个写,而这 两个变量在一个cache line里面。那么写会导致cache line失效。
8. 数据预取
数据预取的依据是预取的数据 马上会用到,这个应该符合空间局部性(spatial locality),但是如何知道预取的数据会被用到,这个 要看上下文的关系。一般来说,数据预取在循环里面用的比较多,因为循环是最符合空间局部性的代码。
可以使用__builtin_prefetch()等函数。