我应该将 let 值放在 for 循环之外以获得更好的性能吗?

Should I put let values out of for loops to get better performance?

例如,如果我有这样的代码

for i in 1 ... 10000 {
    let someValue = 9
    ...
}

我应该将 let 值放在循环之外,这样我可以获得更好的性能还是完全没有必要?

autoreleasepool {
    let someValue = 9
    for i in 1 ... 10000 {
        ...
    }
}

有什么想法吗?

外面

let a = NSDate()
for i in 1...100 {
    let someValue = a
    print("Hello World!")
}
let b = NSDate()
let c: Double = b.timeIntervalSinceDate(a)
print(c)

let d = NSDate()
let someValue = a
for i in 1...100 {
    print("Hello World!")
}
let e = NSDate()
let f: Double = e.timeIntervalSinceDate(d)
print(f)

在操场上玩着 MacBook Air 运行 OSX 的最新版本 c = 0.092 和 f = 0.022

看来您需要改写问题。如果常量不会发生变化,那么它应该在循环之外。循环用于需要变异的重复代码。外面总是更好,因为在里面你必须分配另一个实例 i 次而不是一次。

对于可以快速初始化的类型,您可能不需要使用第二个版本,因为这只会带来较小的性能改进。

编译器也可以将其优化掉。特别是在 structsenums 的情况下,因为它们根本无法改变。尽管使用 类 你可以改变它的内容,如果编译器不能在编译时检查它是否被改变,它就不能被优化。

总而言之,对于 Int 这种简单的情况,使用哪个取决于您,因为假设您做了一些繁重的工作(不仅仅是初始化 Int) 在 for 循环中。

注意:针对不同的作用域 Swift 2 介绍 do {}:

do {
    let someValue = 9
    for i in 1 ... 10000 {
        ...
    }
}