如何写出缓存友好的代码(二)

基于缓存的两个局部性,可以充分利用这两个局部性写出缓存友好的代码。

0 时间局部性

时间局部性最常见的例子就是循环中访问同一变量了。

比如下面求min(inclusive)到max(exclusive)之间的整数之和:

public static int sum(int min, int max) {
    int sum = 0;
    for (int i = min; i < max; i++) {
        sum += i;
    }
    return sum;
}

sum这一变量在循环外声明,在循环内使用。这样就利用了sum的时间局部性。

实践应用提示

  1. 循环处理时,将每次都要处理的数据声明放在循环外,即用数据的时间局部性
  2. 批量处理数据时,将相同的操作放在一起执行,利用指令的时间局部性,比如读数据-处理数据-写数据,再读数据-处理数据-写数据,可以转变成读数据-读数据-处理数据-处理数据-写数据-写数据

1 空间局部性

空间局部性的例子就是数组了。

比如下面求数据之和:

public static int sum(int[] arr) {
    int sum = 0;
    for (int i = 0; i < arr.length; i++) {
        sum += arr[i];
    }
    return sum;
}

上面的例子中,arr中的每个成员在内存中的地址是相邻的,这样访问第一个元素的时候,会把相邻的第二个、第三个等元素都放在缓存中,这样后续再访问这些元素的时候就快了。

实践应用提示

  1. 经常一并访问的对象尽量放在内存地址相近的地方

最后修改于 2020-10-03