For Loop vs While Loop

时间:2012-02-17 10:52:49

标签: loops language-agnostic compiler-construction for-loop while-loop

在我的设计与分析讲座中 教师说,for循环所用的算法将花费更少的时间,然后循环用于以下样本算法。

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. of for while 5次l​​ine 2. 4次因此总时间5 + 4 = 9 但在while循环的情况下。编译器将读取1. 1次,2。 5次,3次4次,4次4次。因此总时间1 + 5 + 4 + 4 = 14次 请告诉我这是对的。 for循环是否比while循环更快?

感谢。

3 个答案:

答案 0 :(得分:6)

至少在MSVC 16(VS 2010)中,代码在两种情况下几乎相同:

作为

; Line 5
    xor esi, esi
$LL3@main:
; Line 6
    push    esi
    push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
    call    _printf
    inc esi
    add esp, 8
    cmp esi, 5
    jl  SHORT $LL3@main

<强>而

; Line 4
    xor esi, esi
$LL2@main:
; Line 6
    push    esi
    push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
    call    _printf
; Line 7
    inc esi
    add esp, 8
    cmp esi, 5
    jl  SHORT $LL2@main

代码in my Subversion repository

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我将传递性能(提示:没有区别,请检查生成的IR或程序集以进行校对)但语法维护有两个重要区别。< / p>

<强>语法

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中,range-for语句:

for (Item const& item : collection) {
}

编译器完全负责迭代,所以你一定不要搞砸了! (它使得for_each算法有些无动于衷......我们可以希望旧形式开始撤退)

通过证据:while循环应该保留给不规则的迭代模式,这样它们会在代码审查期间引起特别的关注,并通过突出显示 不规则性来保护未来的维护者的情况。