局部性

局部性

局部性


前言

一般而言,有良好局部性的程序比局部性差的程序运行得更快。

提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是局部性原理?

一个编写良好的计算机程序常常拥有良好的局部性。也就是,它们倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理。

二、分类

1.时间局部性

在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。
代码如下(示例):

int sumvec(int v[N])
{
	int i,sum = 0;
	for(i = 0; i < N; i++)
		sum += v[i];
	return sum;
}
地址0481216202428
内容v0v1v2v3v4v5v6v7
访问顺序12345678

2.空间局部性

在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
我们说像sumvec这样顺序访问一个向量每个元素的函数,具有步长为 1 的引用模式。有时我们称步长为 1 的引用模式为顺序引用模式。一个连续向量中,每隔 k 个元素进行访问,就称为步长为 k 的引用模式。(一般而言,随着步长的增加,空间局部性下降。)
代码如下(示例):

int sumarrayrows(int a[M][N])
{
	int i, j, sum = 0;
	for (i = 0; i < M; i++)
		for (j = 0; j < N; j++)
			sum += a[i][j];
	return sum;
}
地址048121620
内容a00a01a02a03a04a05
访问顺序123456

3.取指令的局部性

因为程序指令是存放在内存中的,CPU必须取出(读出)这些指令,所以我们也能够评价一个程序关于取指令的局部性。例如,上述的 sumvec 函数中的 for 循环体的指令是按照连续的内存顺序执行的,因此循环具有良好的空间局部性。因为循环体会被执行很多次,所以它也有良好的时间局部性。
代码区别于程序数据一个重要属性是运行时它不能够被修改的。当程序正在被执行时,CPU只从内存中读取它的指令。CPU很少会重写或修改这些指令。


总结

1.重复引用相同变量的程序有良好的时间局部性。
2.对于具有步长为 k 的引用模式的程序,步长越小,空间局部性越好。
3.对于取指令来说,循环有良好的时间和空间局部性。循环迭代次数越多,局部性越好。

参考文献:Randal E.Bryant && David R.O’Hallaron 的《深入理解计算机系统》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值