【问题标题】:Should I access 2D slices in row major order or column major order in Go?我应该在 Go 中以行主要顺序还是列主要顺序访问 2D 切片?
【发布时间】:2022-01-05 09:24:47
【问题描述】:

假设我有以下代码:

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

【问题讨论】:

    标签: arrays for-loop go memory slice


    【解决方案1】:

    第二个版本允许执行更少的索引:您索引一次并获得一行。只能通过索引“内部”切片来完成对一行的迭代。

    所以当迭代一个切片时,总是先循环外层切片,你索引它一次,你会得到一个内层切片。你可以通过只索引内部切片来迭代它(不需要总是索引外部)。

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

    所以这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-06
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多