有人告诉我,while循环比for循环更有效。 (C / C ++) 这似乎是合理的,但我想找到一种方法来证明或反驳它。
我尝试使用类似的代码片段进行三次测试。每个包含Nothing,但具有相同输出的for或while循环:
我是否应该尝试其他任何方式,或者任何人都可以通过某种方式确认?
答案 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会将所有类型的循环转换为一致的形式(当然,尽可能地)。因此,只要您具有相同的功能,如果您使用for
,while
,do-while
或goto
来形成循环,则无关紧要相同的初始化,退出条件以及更新语句和正文,它将生成完全相同的机器代码。
如果在编译期间足够早地完成编译器,那么在编译器中这并不是非常难以完成(因此编译器仍然能够理解实际编写的内容)。这样“使所有循环相等”的目的是你只需要一种方法来优化循环,而不是一个用于while循环,一个用于for循环,一个用于do-while循环,一个用于“任何其他循环” ”
所有编译器都不能保证,但我知道gcc / g ++也会生成几乎相同的代码,无论你使用什么循环结构,从我看到的微软也会这样做。
答案 2 :(得分:1)
C和C ++编译器实际上将高级C或C ++代码转换为汇编代码,而在汇编中,我们没有while
或for
循环。我们只能检查条件并跳转到另一个位置。
因此,for
或while
循环的性能在很大程度上取决于编译器优化代码的强度。
这是关于代码优化的好文章:
http://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf