我应该在 Go 中按行主顺序还是列主顺序访问 2D 切片?

Should I access 2D slices in row major order or column major order in Go?

提问人:user1113569 提问时间:1/5/2022 最后编辑:iczauser1113569 更新时间:1/5/2022 访问量:271

问:

假设我有以下代码:

arr := make([][]byte, 10000)
for i := range arr {
    arr[i] = make([]byte, 10000)
}

像这样遍历数组会更快吗?

for row := len(arr) {
    for col := len(arr[0]) {
        // access arr[col][row]
    }
 }

还是像这样?

for col:= len(arr[0]) {
    for row := len(arr) {
        // access arr[col][row]
    }
 }
数组 for-loop go 内存 切片

评论


答:

2赞 icza 1/5/2022 #1

第二个版本允许执行较少的索引:索引一次,得到一行。循环访问行只能通过索引“内部”切片来完成。

因此,在迭代切片时,始终首先循环外部切片,对其进行一次索引,然后得到一个内部切片。您可以通过仅索引内部切片来循环访问它(无需始终索引外部切片)。

这也会导致顺序内存访问,这可能会导致编译器和运行时进一步优化。

所以这样做是这样的:

for _, row := range arr {
    for _, value := range row {
        // Use value
    }
}

反之(当您首先增加内部切片的索引时),您始终必须使用双索引。