程序的局部性详解

程序的局部性

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值