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