程序的局部性
1.什么是局部性
一个编写良好的据算计程序往往具有良好的局部性,也就是他们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,这种倾向性被称为局部性原理;
2.时间局部性和空间局部性
2.1时间局部性
在一个具有良好的时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再多次被引用;
2.2空间局部性
在一个具有良好的空间局部性的程序中,如果一个内存位置被引用了,那么程序很可能在不远的将来引用附近的一个内存位置;
3.实例探究
3.1实例1
int sum(int a[N])
{
int i ,sum=0;
for(i=0;i<N;i++)
sum += a[i];
return sum;
}
对于sum来说在每一次循环中被调用一次所以它具有很好的时间局部性,因为sum是一个标量所以不存在空间局部性;
另外对于向量a来说,a中的数据是被顺序读取的所以有很好的空间局部性,但是每一个向量元素只被访问一次,所以时间局部性很差;
因为对于循环体中的每个变量,这个函数要么具有好的空间局部性要么具有好的时间局部性,所以我们说这个程序具有好的局部性;
3.1.2二维数组的先列后行和先行后列
int sum1(int a[N][M])
{
int i,j,sum=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
sum += a[N][M];
return sum;
}
这个是先行后列,我们可以发现他每次都让地址单元加一,访问很近的内存;所以我们说这个函数空间局部性好;
int sum1(int a[N][M])
{
int i,j,sum=0;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
sum += a[N][M];
return sum;
}
我们再来看这个函数他对于内存的访问就是跳来跳去的,所以我们认为这个函数的空间局部性差.