2016-03-08 34 views
-1

我喜欢第二种情况,因为它将相关的代码保存在一个地方,但是如果我这样做,那么每次评估闭包时都会重新计算常量?Swift - 计算闭包内的不可变性效率低下吗?

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 
} 

回答

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从你的榜样,一点修改游乐场编译。

让我们做一个简单的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.

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