原视频: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类型占据一个缓存行
所以上面代码两个循环中进行缓存交互的部分是相同的
本文探讨了Java代码中数组遍历的性能差异,通过对比完整遍历和每隔16个元素遍历的耗时,揭示了缓存行对程序效率的影响。循环耗时相近甚至有时更短,说明了缓存交互在64字节缓存行内的相似性。了解这些原理有助于进行代码优化。
2601

被折叠的 条评论
为什么被折叠?



