如果我必须检查两个(或更多)条件中的一个来执行循环中的其余范围,例如,哪些代码最好?
while(condition){
if(some_condition_1 || some_condition_2){
continue;
}
// ... do stuff
}
如果我们知道some_condition_1与some_condition_2相比更经常是真的,那么将下面的条件分开有助于优化代码吗?
while(condition){
if(some_condition_1){
continue;
}
if(some_condition_2){
continue;
}
// do stuff
}
因为如果some_condition_1为真,则不必在第二种情况下检查some_condition_2
答案 0 :(得分:0)
编写最容易阅读的内容,并进行优化编译。
话虽如此,在这种情况下,短路评估意味着您的第一个选择是严格更好的。让我们看看为什么:
假设编译器非常愚蠢(没有优化)。 (我已经删除了你的继续,因为它们也会导致分支,但这个想法是一样的。)
while(condition){
if(some_condition_1 || some_condition_2){
do_stuff();
}
do_different_stuff();
}
这将产生1个分支指令:在if语句中,根据比较的值,指令指针可以跳过包含do_stuff()
和continue
的块到紧接着的点它(在这种情况下,do_different_stuff()
)。根据体系结构,优化和代码的详细信息,可能会为some_condition_1 || some_condition_2
的短路行为生成额外的分支。
这个版本怎么样?
while(condition){
if(some_condition_1){
do_stuff();
continue;
}
if(some_condition_2){
do_stuff();
continue;
}
do_different_stuff();
}
好吧,首先我们点击if(some_condition1)
,程序将“分支” - 有条件地跳转到if(some_condition2)
。在这里,程序将再次分支 ,有条件地跳转到do_different_stuff()
。这是两个保证分支!所以第一个选择更好。