局部性
局部性
前言
一般而言,有良好局部性的程序比局部性差的程序运行得更快。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是局部性原理?
一个编写良好的计算机程序常常拥有良好的局部性。也就是,它们倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理。
二、分类
1.时间局部性
在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。
代码如下(示例):
int sumvec(int v[N])
{
int i,sum = 0;
for(i = 0; i < N; i++)
sum += v[i];
return sum;
}
地址 | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 |
---|---|---|---|---|---|---|---|---|
内容 | v0 | v1 | v2 | v3 | v4 | v5 | v6 | v7 |
访问顺序 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
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;
}
地址 | 0 | 4 | 8 | 12 | 16 | 20 |
---|---|---|---|---|---|---|
内容 | a00 | a01 | a02 | a03 | a04 | a05 |
访问顺序 | 1 | 2 | 3 | 4 | 5 | 6 |
3.取指令的局部性
因为程序指令是存放在内存中的,CPU必须取出(读出)这些指令,所以我们也能够评价一个程序关于取指令的局部性。例如,上述的 sumvec 函数中的 for 循环体的指令是按照连续的内存顺序执行的,因此循环具有良好的空间局部性。因为循环体会被执行很多次,所以它也有良好的时间局部性。
代码区别于程序数据一个重要属性是运行时它不能够被修改的。当程序正在被执行时,CPU只从内存中读取它的指令。CPU很少会重写或修改这些指令。
总结
1.重复引用相同变量的程序有良好的时间局部性。2.对于具有步长为 k 的引用模式的程序,步长越小,空间局部性越好。
3.对于取指令来说,循环有良好的时间和空间局部性。循环迭代次数越多,局部性越好。
参考文献:Randal E.Bryant && David R.O’Hallaron 的《深入理解计算机系统》