我应该为循环设置let值以获得更好的性能吗



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

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

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

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

有什么想法吗?

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

编译器也可以对其进行优化。特别是在structsenums的情况下,因为它们根本不能突变。尽管使用类可以更改其内容,如果编译器无法在编译时检查其是否发生了更改,则无法对其进行优化。

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

注:对于不同的作用域,Swift 2引入了do {}:

do {
    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)

在操场上运行最新版本OSX的MacBook Airc=0.092和f=0.022

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

最新更新