简短答案是肯定的,计算闭包内的不可变是无效的。
这是为什么。比方说,你有这样的代码:
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从你的榜样,一点修改游乐场编译。
让我们做一个简单的for循环来衡量这些功能执行每2500次:我的机器上
let startTime = CACurrentMediaTime()
for var i in 0...2500
{
xCoord1(10)
}
let totalTime = CACurrentMediaTime() - startTime
print("time: - \(totalTime) sec")
案例中0.99秒1个执行(可以是一个有点不同的,如果你有更高或更低的硬件特性)。
现在,让我们看看我们得到了什么,如果我们做同样的情况下2:在我的机器,这意味着它比情况下,效率较低的1.49秒
let startTime2 = CACurrentMediaTime()
for var i in 0...2500
{
xCoord2(10)
}
let totalTime2 = CACurrentMediaTime() - startTime2
print("time: - \(totalTime2) sec")
案例2个执行1.
因此,如果你有恒定的宽度,边距和列数,最好一次计算间隔并将其存储在常量中。 但是,如果您不必多次重复此计算并只需要一次,则仍然可以将其保留在闭包中以便于阅读。 在您的上下文中播放测量性能代码,看看您是否失去了性能,并据此作出决定。