计算机组成原理 - 高速缓存
来看 3 行代码,比较一下两个循环运行所花的时间。
1 | int[] arr = new int[64 * 1024 * 1024]; |
按道理来说,循环1 花费的时间应该是循环2 的 16 倍左右。但实际上,循环1 在我的电脑上运行需要 50 毫秒,循环2 只需要 46 毫秒。相差在 15% 之内,1 倍都没有。
这就是 CPU Cache (高速缓存)带来的效果。
程序执行时,CPU 将对应的数据从内存中读取出来,加载到 CPU Cache 里。这里注意,CPU 是一小块一小块来读取数据的,而不是按照单个数组元素来读取数据的。
这一小块一小块的数据,在 CPU Cache 里面,我们把它叫作 Cache Line(缓存块)。
日常用的 Intel 服务器或者 PC 中,Cache Line 的大小通常是 64 字节。
上面的循环2 里面,每隔 16 个整型数计算一次,16 个整型数正好是 64 个字节。所以,循环1 和循环2,都需要把同样数量的 Cache Line 数据从内存中读取到 CPU Cache 中,导致两个程序花费的时间就差别不大了。