void foo(const int constant)
{
for(int i = 0; i < 1000000; i++) {
// do stuff
if(constant < 10) { // Condition is tested million times :(
// inner loop stuff
}
}
}
每次执行外部循环时都会检查“constant”的值。然而,"constant"从未改变过,因此反复测试条件 "constant < 10?"浪费了大量CPU时间。人类在几次通过后就会意识到"constant"永远不会改变,并且聪明地避免反复检查它。编译器是否能够注意到这一点并进行智能优化,或者重复的if循环是不可避免的?
个人认为问题是不可避免的。即使编译器将比较放在外部循环之前,并设置某种布尔变量"skip_inner_stuff",该变量仍然必须在每次外部for循环中进行检查。
你对此有何想法?是否有更有效的方法来编写上面的代码段以避免这个问题?
do stuff
的大小,您可能会发现编译器选择不优化它。这是有道理的,因为除非在将constant
作为i.c.e内联到调用foo
的位置,否则必须复制do stuff
。此外,如果do stuff
是大量代码,则分支的成本可能相对较低。因此,我认为标准应该是编译器能够执行优化,而不一定是它实际上在这个提问者的真实代码中执行了优化 :-) - Steve Jessop