为什么在Swift调试模式下,for-in循环比while循环慢?
如果您认为是运行在“无优化”模式下的话,是这样的。
下面的代码比较了for-in和while在“无优化”模式下的执行时间:
49999995000000 for-in -- 时间 = 3.3352
4999999950000000 while -- 时间 = 0.3613
但是,如果使用“加速优化”,则结果如下:
49999995000000 for-in -- 时间 = 0.0037
49999995000000 while -- 时间 = 0.0035
我想知道,“为什么在无优化模式下for-in比while慢?而在优化模式下它们为什么会快呢?”
下面的代码比较了for-in和while在“无优化”模式下的执行时间:
49999995000000 for-in -- 时间 = 3.3352
4999999950000000 while -- 时间 = 0.3613
但是,如果使用“加速优化”,则结果如下:
49999995000000 for-in -- 时间 = 0.0037
49999995000000 while -- 时间 = 0.0035
我想知道,“为什么在无优化模式下for-in比while慢?而在优化模式下它们为什么会快呢?”
import Foundation
func processTime(_ title: String, blockFunction: () -> ()) {
print()
let startTime = CFAbsoluteTimeGetCurrent()
blockFunction()
let processTime = CFAbsoluteTimeGetCurrent() - startTime
print(title, " -- time = \(String(format : "%.4f",processTime))")
}
processTime("for-in") {
var sum = 0
for i in 0..<10000000 {
sum += i
}
print(sum)
}
processTime("while") {
var sum = 0
var i = 0
while i<10000000 {
sum += i
i += 1
}
print(sum)
}
swiftc -emit-sil -O <file.swift>
很有用。这将转储出 Swift 在 Swift 中间语言级别上的“真正”操作。Clang 通常会进一步优化这些内容,但学习阅读 SIL 输出是学习优化的重要技能。您可能还对探索非优化与优化后的(0..<10000000).reduce(0, +)
的巨大差异感兴趣。 - Rob Napier