原视频:https://www.bilibili.com/video/BV1Rg41157KU
public class CalcTest {
public static void main(String[] args) {
int[] arr = new int[64 * 1024 * 1024];
// 遍历所有元素
long start1 = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
arr[i] *= 3;
}
System.out.println("循环1耗时:" + (System.currentTimeMillis() - start1) + "毫秒");
// 遍历 1/16 的元素
long start2 = System.currentTimeMillis();
for (int i = 0; i < arr.length; i += 16) {
arr[i] *= 3;
}
System.out.println("循环2耗时:" + (System.currentTimeMillis() - start2) + "毫秒");
}
}
耗时几乎一样,甚至有的时候循环1耗时更短。
缓存和内存中心的交互不是一个字节一个字节的交互,而是使用CacheLine缓存行
CacheLine:64byte
取64byte中任意一个数据都要交互一整行
int类型占4个byte,16个int类型占据一个缓存行
所以上面代码两个循环中进行缓存交互的部分是相同的