For循环vs While循环
在我的设计和分析 讲座中,教师说for循环对于下面的示例算法,while循环将花费更少的时间。For循环vs While循环
1. for(int i=0;i<5;i++)
{
2. print(i);
}
1. int i=0;
2. while(i<5)
{
3. print(i);
4. i++;
}
他说,编译器将读取的1.而5次第2行的4倍从而总时间5 + 4 = 9 但在while循环的情况下。编译器将读取1次,2次。 5次,4次4次,4次4次。因此总时间1 + 5 + 4 + 4 = 14时间 请告诉我这是正确的。循环比while循环更快吗?
谢谢。
至少与MSVC 16(VS 2010)的代码是相当多的在这两种情况下是相同的:
为
; Line 5
xor esi, esi
[email protected]:
; Line 6
push esi
push OFFSET [email protected][email protected][email protected]
call _printf
inc esi
add esp, 8
cmp esi, 5
jl SHORT [email protected]
而
; Line 4
xor esi, esi
[email protected]:
; Line 6
push esi
push OFFSET [email protected][email protected][email protected]
call _printf
; Line 7
inc esi
add esp, 8
cmp esi, 5
jl SHORT [email protected]
感谢*理智*。 (请注意,只有调试信息和标签名称不同) – 2012-02-17 12:13:46
在所有现代编译器中,loop analysis是在较低级别的中间表示(即,当所有高级循环结构被扩展为标号和跳转时)完成的。对于编译器来说,两个循环是完全等价的
我可以提供什么逻辑原因或证明来与他争论。 – wali 2012-02-17 11:17:45
@wali,向他展示两个版本的汇编输出,给出这些幻灯片,在'gcc'或'llvm'(这是现代编译器的典型代表)中显示相关的转换实现。 – 2012-02-17 11:22:25
我会通过对性能(提示:没有区别,检查产生的IR或组装的证明),然而还有在语法和维护两个重要的区别。
语法
i
所述变量的范围是不同的。在for
的情况下,i
只能在for
标头和机体内访问,而在while
的情况下,它在循环后可用。作为一般规则,最好有更严格的范围,更少的变量正在进行中的意味着编码时不必担心的上下文。
维护
的for
循环有分组的所有操作并拢迭代整齐的优势,这样他们就可以一次性检查等检查。
而且,存在引入continue
语句时一个重要的不同:
for(int i = 0; i != 10; ++i) {
if (array[i] == nullptr) { continue; }
// act on it
}
int i = 0;
while (i != 10) {
if (array[i] == nullptr) { continue; }
// act on it
++i;
}
在while
情况下,引进continue
创造了一个错误:无限循环,当计数器不再执行。
影响
for
循环是更具可读性和全能更好地为定期迭代模式。更妙的是,在C++ 11的范围内,对声明:
for (Item const& item : collection) {
}
其中迭代完全由编译器的照顾,所以你一定不要乱了! (它使for_each
算法有些毫无意义......和形式开始撤退,我们可以希望老)
通过corrolary:while
循环应在代码审查保留不规则的迭代模式,这样,他们将吸引优抚从未来的维护者通过突出显示的不规范的情况。
一个编译器设置为opmizing的速度可能只是发出'print(i)'五次,并完全消除循环。在这两种情况下。 – Joey 2012-02-17 10:58:14
在现实世界中,我们关注代码的可读性,并根据它选择“for”或“while”。编译器会优化差异。或者现代机器上的差别很小,因此可以忽略不计。使用那个让你的生活更轻松的,而不是电脑的“生活”。 – Bazzz 2012-02-17 10:59:58
如果没有设置优化,然后? – wali 2012-02-17 11:00:14