Swift - 在闭包中计算不可变是否效率低?

时间:2016-03-08 08:35:54

标签: swift performance closures immutability

我喜欢案例2,因为它将相关代码保存在一个地方,但如果我这样做,那么每次评估闭包时都会重新计算常量吗?

let numCols = 99

// case 1
let spacing = (width - margin.left - margin.right) / (numCols - 1)
let xCoord = { (Int: col) -> Float in margin.left + col * spacing }

// case 2
let xCoord = { (Int: col) -> Float in
    let spacing = (width - margin.left - margin.right) / (numCols - 1)
    return margin.left + col * spacing
}

1 个答案:

答案 0 :(得分:3)

简短的回答是肯定的,在闭包中计算不可变的效率很低。

这就是原因。我们假设你有这样的代码:

let numCols = 99.0
let width = 800.0
let marginLeft = 15.0
let marginRight = 20.0

// case 1
let spacing: Double = (width - marginLeft - marginRight) / (numCols - 1)
let xCoord1 = { (col: Double) -> Double in
    return marginLeft + col * spacing
}

// case 2
let xCoord2 = { (col: Double) -> Double in
    let spacing: Double = (width - marginLeft - marginRight) / (numCols - 1)
    return marginLeft + col * spacing
}

这些是您的示例中的案例1和案例2,稍微修改为在Playground中编译。

让我们做一个简单的for循环来测量这些函数的执行次数各2500次:

let startTime = CACurrentMediaTime()
for var i in 0...2500
{
    xCoord1(10)
}
let totalTime = CACurrentMediaTime() - startTime
print("time: - \(totalTime) sec")

案例1在我的机器上执行0.99秒(如果你有更低或更高的硬件特性,可能会有点不同)。

现在,让我们看看如果我们对案例2做同样的事情我们得到了什么:

let startTime2 = CACurrentMediaTime()
for var i in 0...2500
{
    xCoord2(10)
}
let totalTime2 = CACurrentMediaTime() - startTime2
print("time: - \(totalTime2) sec")

案例2在我的机器上执行1.49秒,这意味着它的效率低于案例1.

因此,如果您有恒定的宽度,边距和列数,最好一次计算间距并将其存储在常量中。 但是,如果您不必多次重复此计算并且只需要一次,您仍然可以将其保留在闭包中以便于阅读。 在您的上下文中使用测量性能代码,看看您是否失去了性能,并根据它做出决定。