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

Swift-在闭包中计算不可变项是否效率低下?,swift,performance,closures,immutability,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:

我喜欢案例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
}

简单的回答是肯定的,在闭包中计算不可变项是低效的

这就是原因。假设您有这样一个代码:

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")
案例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

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