局部性通常有两种不同的形式: 时间局部性和空间局部性
- 在一个具有良好时间局部性的程序中, 被引用过一次的内存位置很可能在不远的将来再被多次引用。
- 在一个具有良好空间局部性的程序中, 如果一个内存位置被引用了一次, 那么程序很可能在不远的将来引用附近的一个内存位置。
量化评价程序中局部性的一些简单原则:
- 重复引用相同变量的程序有良好的时间局部性。
- 对于具有步长为K的引用模式的程序, 步长越小, 空间局部性越好。具有步长为l的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差。
- 对于取指令来说, 循环有好的时间和空间局部性。循环体越小, 循环迭代次数越多, 局部性越好。
例子:图中三个函数, 以不同的空间局部性程度, 执行相同的操作。请对这些函数就空间局部性进行排序。解释你是如何得到排序结果的。
解决这个问题的关键在干想象出数组是如何在内存中排列的,然后分析引用模式。函数clear1以步长为1 的引用模式访问数组,因此明显地具有最好的空间局部性。函数clear2依次扫描N个结构中的每一个,这是好的,但是在每个结构中,它以步长不为1的模式跳到下列相对于结构起始位置的偏移处: 0、12、4、16、8、20 。所以clear2的空间局部性比clearl的要差。函数clear3不仅在每个结构中跳来跳去,而且还从结构跳到结构,所以clear3的空间局部性比clear2和clear1都要差。