Swift 我是否应该将let值从for循环中输出以获得更好的性能?

Swift 我是否应该将let值从for循环中输出以获得更好的性能?,swift,performance,for-loop,let,Swift,Performance,For Loop,Let,例如,如果我有这样的代码 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 someV

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

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次,而不是一次。

对于可以很快初始化的类型,可能不需要使用第二个版本,因为这只会导致性能的轻微改进

编译器还可以对其进行优化。尤其是在
structs
enum
的情况下,因为它们根本无法变异。尽管对于类,您可以修改它的内容,如果编译器不能在编译时检查它是否被修改,那么就无法对其进行优化

总之,对于
Int
这样一个简单的例子,您可以选择使用哪一个,因为假设您在for循环中做了一些繁重的工作(不仅仅是初始化
Int
),那么性能几乎没有提高

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

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

反问:为什么你会把它放在线圈的体内?@vikingosegundo,因为它只在那里需要。这也是为什么我在其他代码中使用autoreleasepool,因为我不想在其他作用域中使用它。autoreleasepool对于范围界定是一个相当糟糕的主意。使用方法和隐式来创建较小的作用域。这不仅与所花费的时间有关。这是错误的,如果每次都使用相同的值,就没有必要分配内存。您在每个周期中分配和释放内存,如果要使用比Int更大的对象,则需要时间和内存。您的方法对我很好。但是,如果代码编译在.swift文件中,我想知道答案是否相同?因为游乐场是逐行运行的。不幸的是,游乐场不是测试这一点的最佳场所,但如果您将代码添加为源文件(到游乐场),甚至创建一个新项目,在其中可以调整优化,您可以获得更可靠的结果。我创建了一个新的命令行项目,并使用@CodyWeaver的方法。在100万个循环的测试中,性能损失仅为1/1000。所以我相信任何一种方式都可以。谢谢。我已经给了你一个升级票,从-1到0。我不知道为什么会有否决票,因为我认为你的答案不应该被否决。@CodyWeaver OwenZhao如果与此问题无关,请转到聊天室。@Qbyte哪里可以找到聊天室?