1

在我的设计和分析 讲座中,教师说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循环更快吗?

谢谢。

+0

一个编译器设置为opmizing的速度可能只是发出'print(i)'五次,并完全消除循环。在这两种情况下。 – Joey 2012-02-17 10:58:14

+0

在现实世界中,我们关注代码的可读性,并根据它选择“for”或“while”。编译器会优化差异。或者现代机器上的差别很小,因此可以忽略不计。使用那个让你的生活更轻松的,而不是电脑的“生活”。 – Bazzz 2012-02-17 10:59:58

+0

如果没有设置优化,然后? – wali 2012-02-17 11:00:14

回答

6

至少与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] 

代码in my Subversion repository

+2

感谢*理智*。 (请注意,只有调试信息和标签名称不同) – 2012-02-17 12:13:46

2

在所有现代编译器中,loop analysis是在较低级别的中间表示(即,当所有高级循环结构被扩展为标号和跳转时)完成的。对于编译器来说,两个循环是完全等价的

+0

我可以提供什么逻辑原因或证明来与他争论。 – wali 2012-02-17 11:17:45

+0

@wali,向他展示两个版本的汇编输出,给出这些幻灯片,在'gcc'或'llvm'(这是现代编译器的典型代表)中显示相关的转换实现。 – 2012-02-17 11:22:25

2

我会通过对性能(提示:没有区别,检查产生的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循环应在代码审查保留不规则的迭代模式,这样,他们将吸引优抚从未来的维护者通过突出显示不规范的情况。