程序的局部性详解

程序的局部性

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<;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;
}

我们再来看这个函数他对于内存的访问就是跳来跳去的,所以我们认为这个函数的空间局部性差.

发布了35 篇原创文章 · 获赞 82 · 访问量 7549

猜你喜欢

转载自blog.csdn.net/qq_44049351/article/details/97612549