缓存行有多大?代码怎么写才能跟缓存配合?这篇用 Java 步长遍历、二维数组遍历和随机依赖读,在本机上把缓存行大小和各级缓存容量「测」出来,再和 sysctl 的数字对照。
hw.cachelinesize = 128 hw.l1dcachesize = 65536 hw.l2cachesize = 4194304 hw.perflevel0.l1dcachesize = 131072 hw.perflevel0.l2cachesize = 16777216 hw.perflevel1.l1dcachesize = 65536 hw.perflevel1.l2cachesize = 4194304 hw.perflevel0.logicalcpu = 6 hw.perflevel1.logicalcpu = 4
数组 256 MB(int[67108864]);每个步长重复 5 次取最小值;「总时间」是遍历一遍(访问 N/步长 个元素) 步长 访问元素数 总时间 ms 每次访问 ns 1 67108864 40.23 0.599 2 33554432 20.24 0.603 4 16777216 10.07 0.600 8 8388608 4.94 0.588 16 4194304 4.42 1.053 32 2097152 7.36 3.510 64 1048576 4.07 3.880 128 524288 2.01 3.828 256 262144 0.86 3.266 1024 65536 0.23 3.524 4096 16384 0.07 4.097
4096×4096 的 int 矩阵(64 MB):按行遍历(内层是 j)10.1 ms;按列遍历(内层是 i)47.7 ms;比值 4.7 倍
工作集大小 随机依赖读 ns/次 4 KB 1.72 16 KB 1.72 32 KB 1.72 64 KB 1.73 128 KB 1.74 256 KB 3.97 512 KB 5.02 1 MB 5.55 2 MB 6.00 4 MB 5.94 8 MB 7.03 16 MB 11.32 32 MB 31.64 64 MB 70.65 256 MB 105.20