代码之家  ›  专栏  ›  技术社区  ›  XueYu

为什么这种for-loop方法比map方法慢?

  •  0
  • XueYu  · 技术社区  · 8 年前

    我在Playground测试了我的代码,但正如讨论中指出的那样,Playground是调试配置,一旦我把所有这些代码放在真正的应用程序中运行,它们就不会有太大的差别。以前不知道这个调试/发布的事情。

    func p1() -> [[Int]]{
        var offsets = [[Int]]()
        for row in 0..<height {
            var rowOffset = [Int]()
            for col in 0..<width {
                let offset = width * row + col
                rowOffset.append(offset)
            }
            offsets.append(rowOffset)
        }
        return offsets
    }
    

    但速度很慢,我用这种方法搜索并找到了一些代码片段循环:

    func p2() -> [[Int]]{
        return (0..<height).map{ row in
            (0..<width).map { col in
                let offset = width * row + col
                return offset
            }
        }
    }
    

    所以我测试了如果我使用函数p1和p2在高度=128和宽度=128的图像中循环,p1比p2慢18倍,为什么p1比p2慢?此外,我想知道还有其他更快的方法来完成这项任务吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Lily Ballard    8 年前

    最明显的原因是 map 方法更快是因为 地图 预先分配阵列容量(因为它知道结果阵列中有多少个元素)。您也可以在代码中通过调用 ary.reserveCapacity(n)

    func p1() -> [[Int]]{
        var offsets = [[Int]]()
        offsets.reserveCapacity(height) // NEW LINE
        for row in 0..<height {
            var rowOffset = [Int]()
            rowOffset.reserveCapacity(width) // NEW LINE
            for col in 0..<width {
                let offset = width * row + col
                rowOffset.append(offset)
            }
            offsets.append(rowOffset)
        }
        return offsets
    }