while循环比循环更有效

时间:2016-01-10 21:38:09

标签: c++

有人告诉我,while循环比for循环更有效。 (C / C ++) 这似乎是合理的,但我想找到一种方法来证明或反驳它。

我尝试使用类似的代码片段进行三次测试。每个包含Nothing,但具有相同输出的for或while循环:

  1. 编译时间 - 大致相同
  2. 运行时间 - 相同
  3. 编译成英特尔汇编代码并进行比较 - 相同数量的行和几乎相同的代码
  4. 我是否应该尝试其他任何方式,或者任何人都可以通过某种方式确认?

3 个答案:

答案 0 :(得分:3)

所有循环都遵循相同的模板:

{
// Initialize
LOOP: 
    if(!(/* Condition */) ) {
        goto END
    }

    // Loop body

    // Loop increment/decrement
    goto LOOP
}
END:

因此两个循环是相同的:

// A
for(int i=0; i<10; i++) {
    // Do stuff
}

// B
int i=0;
while(i < 10) {
    // Do stuff
    i++;
}

// Or even
int i=0;
while(true) {
    if(!(i < 10) ) {
        break;
    }

    // Do stuff
    i++;
}

两者都转换为类似于:

的东西
{
int i=0;
LOOP: 
    if(!(i < 10) ) {
        goto END
    }

    // Do stuff

    i++;
    goto LOOP
}
END:

未使用/无法访问的代码将从最终的可执行文件/库中删除。

Do-while循环跳过第一次条件检查,并留给读者练习。 :)

答案 1 :(得分:1)

当然LLVM会将所有类型的循环转换为一致的形式(当然,尽可能地)。因此,只要您具有相同的功能,如果您使用forwhiledo-whilegoto来形成循环,则无关紧要相同的初始化,退出条件以及更新语句和正文,它将生成完全相同的机器代码。

如果在编译期间足够早地完成编译器,那么在编译器中这并不是非常难以完成(因此编译器仍然能够理解实际编写的内容)。这样“使所有循环相等”的目的是你只需要一种方法来优化循环,而不是一个用于while循环,一个用于for循环,一个用于do-while循环,一个用于“任何其他循环” ”

所有编译器都不能保证,但我知道gcc / g ++也会生成几乎相同的代码,无论你使用什么循环结构,从我看到的微软也会这样做。

答案 2 :(得分:1)

C和C ++编译器实际上将高级C或C ++代码转换为汇编代码,而在汇编中,我们没有whilefor循环。我们只能检查条件并跳转到另一个位置。

因此,forwhile循环的性能在很大程度上取决于编译器优化代码的强度。

这是关于代码优化的好文章:

http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf