Cpu 对于可能被多次访的内存区域,会将其复制到 cache 中,之后访问不再从主存中获取,提升效率。从 ram 到 cache 的复制过程(Block Transfer),复制单位为 linesize ,此处为 64 byte。
请看如下代码段,1 与 2 所需时间差不多,甚至 2 有时时间比 1 还长 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
int[] arr = new int[1 << 26];
long t1 = System.currentTimeMillis(); for (int i = 0; i < arr.length; i++) arr[i] *= 3; System.out.println(System.currentTimeMillis() - t1 + " ms");
long t2 = System.currentTimeMillis(); for (int i = 0; i < arr.length; i += 2) arr[i] *= 3; System.out.println(System.currentTimeMillis() - t2 + " ms");
long t3 = System.currentTimeMillis(); for (int i = 0; i < arr.length; i += 32) arr[i] *= 3; System.out.println(System.currentTimeMillis() - t3 + " ms");
|
1 与 2 Block transfer 次数相同,时间不会差太多
3 相比于 1 和 2 Block transfer 少了一倍,时间与其相差略小于一倍