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

Arrays 为什么这种for-loop方法比map方法慢?,arrays,swift,performance,for-loop,map-function,Arrays,Swift,Performance,For Loop,Map Function,我在游乐场测试了我的代码,但正如讨论所指出的,游乐场是调试配置,一旦我将所有这些代码放在真正的应用程序运行中,它们就不会有太大的区别。以前不知道这个调试/发布的事情。 Swift性能相关问题,我需要遍历图像的像素偏移量,首先我尝试用这种方式 func p1() -> [[Int]]{ var offsets = [[Int]]() for row in 0..<height { var rowOffset = [Int]() for c

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

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
}
func p1()->[[Int]]{
变量偏移量=[[Int]]()

对于0..中的行,
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
}
func p1()->[[Int]]{
变量偏移量=[[Int]]()
偏移量.保留容量(高度)//新行

对于0中的行。谢谢,通过使用它,它得到了改进,但只是一点点,map仍然获胜overwhelmingly@XueYu您是在调试还是在发布配置中进行测试?
map
版本在这两个方面都会很快,因为stdlib是通过优化编译的,但是您的自定义版本在发布时会比在调试时快得多。我只是做了很多工作在操场上测试,使用CACurrentMediaTime()以显示使用的时间。游乐场将处于调试配置中。请尝试在您在发布模式下编译的实际应用程序中运行相同的内容。没错,这是调试与发布配置的问题。即使我将原始代码放在运行的实际应用程序中,它们也没有多大区别。我以前不知道这一点。非常感谢。
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
}