存储器层次结构
局部性
局部性良好高速缓存友好
let a = [[Int]](repeating: [Int](0..<10_0000), count: 10_0000)
var sum = 0
for i in 0..<10_0000 {
for j in 0..<10_0000 {
sum += a[i][j]
}
}
局部性差高速缓存不友好
访问完一个子数组之后再访问下一个子数组称为行优先;访问完所有子数组的第一个元素后再访问第二个元素称为列优先。行优先局部性好,在访问子数组的某个元素后,邻近的元素会被从内存加载到高速缓存中,接下来几次内存引用都会缓存命中;列优先局部性差,在访问子数组的某个元素后,跳到下一个子数组访问某个元素,缓存不命中需要直接访问内存
var sum = 0
for j in 0..<10_0000 {
for i in 0..<10_0000 {
sum += a[i][j]
}
}