【问题标题】:why this for loop approach is so slow compared with the map approach?为什么这种 for 循环方法与 map 方法相比如此缓慢?
【发布时间】:2018-03-14 02:22:12
【问题描述】:

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

Swift 性能相关问题,我需要遍历图片的像素偏移量,首先我是这样尝试的。

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
}

但是很慢,我搜了一下发现有一段代码sn-p loop through offset这种方式:

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

所以我测试了如果我使用函数 p1 和 p2 循环通过 height = 128 和 width = 128 image , p1 比 p2 慢 18 倍,为什么 p1 与 p2 相比如此慢?我也想知道这个任务还有其他更快的方法吗?

【问题讨论】:

    标签: arrays swift performance for-loop map-function


    【解决方案1】:

    map 方法更快的最明显原因是因为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
    }
    

    【讨论】:

    • 谢谢,通过使用它有所改善,但只是一点点,地图仍然以压倒性优势获胜
    • @XueYu 你是在 Debug 还是 Release 配置中测试? map 版本在这两种情况下都很快,因为 stdlib 是通过优化编译的,但是您的自定义版本在 Release 中会比在 Debug 中快得多。
    • 我只是在操场上做了非常简单的测试,使用 CACurrentMediaTime() 来显示使用的时间。
    • Playground 将处于调试配置中。尝试在发布模式下编译的实际应用程序中运行相同的东西。
    • 你是对的,这是调试与发布配置问题。即使我将原始代码放在运行的真实应用程序中,它们也没有太大的不同。我以前不知道这件事。非常感谢。
    猜你喜欢
    • 2011-07-28
    • 2021-01-16
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多