为什么在快速调试模式下,for的运行速度慢于swift调试模式?

为什么在快速调试模式下,for的运行速度慢于swift调试模式?,swift,for-loop,Swift,For Loop,为什么在快速调试模式下,for的运行速度慢于swift调试模式? 如果您认为是,它是在中运行的,没有优化 ⬇️在下面的代码中,比较了未优化和未优化时的时间 4999995000000 对于in--time=3.3352 499999950000000 而——时间=0.3613 ⬇️但是,如果使用优化速度 4999995000000 对于in--time=0.0037 4999995000000 而——时间=0.0035 我想知道“为什么在没有优化的情况下for比while慢?为什么在优化的情况下

为什么在快速调试模式下,for的运行速度慢于swift调试模式? 如果您认为是,它是在中运行的,没有优化

⬇️在下面的代码中,比较了未优化和未优化时的时间

4999995000000 对于in--time=3.3352

499999950000000 而——时间=0.3613

⬇️但是,如果使用优化速度

4999995000000 对于in--time=0.0037

4999995000000 而——时间=0.0035

我想知道“为什么在没有优化的情况下for比while慢?为什么在优化的情况下for和while那么快?”

<代码>导入基础 func processTime(uu标题:字符串,块函数:()->()){ 打印() 让startTime=CFAbsoluteTimeGetCurrent() blockFunction() 让processTime=CFAbsoluteTimeGetCurrent()-startTime 打印(标题“--time=\(字符串(格式:%.4f”,processTime))) } processTime(“for in”){ var总和=0
对于0..中的i,从Swift的角度来看,您的
for
循环实际上转换为如下内容:

let range = 0..<10000000
var iterator = range.makeIterator()
while let next = iterator.next() {
    ...
}


80%的时间都花在
next()
,看看它有多少功能!我的屏幕截图甚至不能包含所有内容。字符串连接只占大约6%(不在屏幕截图中)。

多亏了你,我现在可以学习makeIterator()即使是你们谈论的虚拟方法的非常重要的概念。非常感谢!哦,我的天!我不知道那个很酷的时间分析器。我应该学习它。谢谢。我真的很想看到它。它将对我非常有用!非常感谢!你们可能会发现运行
swiftc-emit-sil-O
也很有用。这就排除了Swift是什么“真的”做,至少在Swift中间语言的水平上。Clang通常会进一步优化这些东西,但学习阅读SIL输出是学习优化的一项伟大技能。您可能还对探索
(0..@RobNapier噢,谢谢!!事实上我知道SIL,但感谢你,不知道这个概念的人可以理解“什么是SIL?,为什么SIL在编译时有用?”甚至你也给出了一些有趣的例子。非常感谢!我还需要学习SIL更多。@RobNapier我用godbolt比较汇编代码。我看到优化版去掉了所有的
索引迭代器,但在其他方面无法阅读asm。我从来都不知道SIL是个东西!谢谢你告诉我这一点!
var s = ""
for i in 0...10000000 {
    s += "\(i)"
}