我对空间和时间局部的含义有点困惑。我希望通过一个数组示例来看它,这将有助于我更好地理解它。
在这样的例子中: A [0] [1],A [0] [2],A [0] [3] ....等
这是否证明了时间局部性?我看到同一行被多次访问但是在不同的偏移处...这是否意味着访问了不同的地址?
另外,我说的是这样的例子: A [1],A [2],A [3] ......等
展示空间位置?
希望对实时代码中时空局部性如何工作的一些澄清将有助于我更好地理解它们。
答案 0 :(得分:70)
空间和时间局部性描述了程序如何访问数据(或指令)的两个不同特征。维基百科有一篇关于locality of reference的好文章。
如果在时间上接近引用的内容在空间中也很近(附近的内存地址,磁盘上的附近扇区等),则称一系列引用具有spatial
位置。如果对同一事物的访问在时间上聚集,则称序列具有temporal
位置。
如果一个程序访问一个大型数组中的每个元素并读取它一次然后移动到下一个元素并且不再重复访问任何给定位置,直到它触及其他所有位置,那么它是一个明显的< em> spatial 位置,但不是 temporal 位置。另一方面,如果程序花费时间重复访问阵列上的位置的随机子集,然后再转移到另一个随机子集,则称其具有 temporal 位置但不 spatial locality。编写良好的程序将具有将一起访问的内容组合在一起的数据结构,从而确保空间位置。如果您的程序在访问 A 后很快就可以访问 B ,那么 A 和 B 应该分配在附近彼此。
你的第一个例子
A[0][1], A[0][2], A[0][3]
显示空间位置,及时访问的内容在空间中很近。它没有显示 temporal 位置,因为您没有多次访问同一个东西。
你的第二个例子
A[1], A[2], A[3]
还会显示空间位置,但不会显示时间位置。
以下是显示时间位置
的示例A[1], A[2000], A[1], A[1], A[2000], A[30], A[30], A[2000], A[30], A[2000], A[30], A[4], A[4]
答案 1 :(得分:16)
简单来说,
时间局部性:在一个点上引用的资源的概念 及时将在不久的将来某个时间再次引用。
空间位置:引用资源的可能性的概念 如果刚刚引用它附近的资源,则更高。
来源:维基百科
答案 2 :(得分:8)
以下是具有局部性的代码示例:
var sum = 0;
for (i = 0; i < n; i++){
for(j=0; j < m ; j++){
sum += a[i][j];
}
}
return sum;
存在时间局部性,因为在循环中经常访问sum。通过将最近使用的指令和数据值保留在缓存中并利用缓存层次结构来利用时间局部性。甚至在寄存器中,根本不在内存中。
存在空间局部性,因为我们有一个数组'a'并且我们 按顺序访问数组的每个元素。通常通过使用较大的缓存块并将预取机制(获取预期使用的项)合并到缓存控制逻辑中来利用空间局部性。
答案 3 :(得分:0)
时间位置是空间位置的特例。
答案 4 :(得分:0)
我断断续续地很难记住他们之间的区别,尽管我记得两种类型的地方。
Spatial Locality 要记住要牢记“顺序”副词。
临时地点要记住,在学习排序算法的开始时,您会看到要交换的“临时变量”。例如气泡排序。它有两个循环,交换起来就像int temp = .....
。
通过这种方式,您可以识别出哪个定义属于哪个定义。
答案 5 :(得分:0)
时间局部性:时间局部性是基于重复引用的资源。
空间局部性:空间局部性表示将在不久的将来请求与最近引用的数据相邻的数据。