引言
根据时间局部性和空间局部性原理,我们就能明白高速缓存存储器的工作原理,局部性比较好的程序往往具有更好的性能,即运行得更快。因此,遵从局部性原理,好的程序员应该确保编写出高速缓存友好的代码。
高速缓存友好代码分析
#include<stdio.h>
void main()
{
int a[4]={1,2,3,4};
int i;
int sum=0;
for(i=0;i<4;i++)
sum+=a[i];
}
该程序具有良好的时间局部性,因为i,sum均被重复使用多次;该程序也具有良好的空间局部性,因为依次读取数组a的4个元素,由于int类型占据4个字节,因此只要高速缓存块大小大于16个字节(intel i7的块大小为64Bytes,因此足够),它们就可以一起被读入高速缓存块中,而仅仅是a[0]发生了高速缓存不命中,因为它第一个被读取需要加载,而后面3个量均为高速缓存命中。
高速缓存不友好代码分析
#include<stdio.h>
void main()
{
int a[2][2]={{1,2},{3,4}};
int i,j,sum=0;
for(int j=0;j<2;j++) {
for(int i=0;i<2;i++) {
sum+=a[i][j];
}
}
}
由于C语言是按行优先顺序来存储的,所以这个循环的步长不是以1为单位的,并且每次读取都要换行,所以所有的读取都发生了缓存不命中情况,程序运行效率会比高速缓存友好的程序慢一倍!
后记
在平时的编程中,应该尽量避免编写局部性很差的程序,尝试编写高速缓存友好高质量的代码。