存储器层次结构

局部性

局部性良好高速缓存友好

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]
    }
}