提问人:user1113569 提问时间:1/5/2022 最后编辑:iczauser1113569 更新时间:1/5/2022 访问量:271
我应该在 Go 中按行主顺序还是列主顺序访问 2D 切片?
Should I access 2D slices in row major order or column major order in Go?
问:
假设我有以下代码:
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]
}
}
答:
2赞
icza
1/5/2022
#1
第二个版本允许执行较少的索引:索引一次,得到一行。循环访问行只能通过索引“内部”切片来完成。
因此,在迭代切片时,始终首先循环外部切片,对其进行一次索引,然后得到一个内部切片。您可以通过仅索引内部切片来循环访问它(无需始终索引外部切片)。
这也会导致顺序内存访问,这可能会导致编译器和运行时进一步优化。
所以这样做是这样的:
for _, row := range arr {
for _, value := range row {
// Use value
}
}
反之(当您首先增加内部切片的索引时),您始终必须使用双索引。
评论