如果我在循环的条件语句中
调用方法,是否会在每次循环迭代时
调用它?
例如:
for( int i = 0; i <= expensiveComputation(); i++ ) {
// Do something.
}
我会在每次迭代中执行昂贵的Computation()吗?或者,在循环变量初始化的同时,是否会在每次迭代中存储和使用expensiveComputation()的结果?
我应该重新写它:
int max = expensiveComputation();
for ( int i = 0; i <= max; i++ ) {
// Do something.
}
除非编译器/优化器确定它没有副作用并且可能将
调用作为优化消除,否则将在每次迭代时
调用它.
我的意思是,编译器不能盲目地存储该值,因为java中的函数与数学函数不同,不仅可以具有返回值,还可以具有将某些内容打印到某个流或改变某些全局状态等的副作用.
还有另一个原因,为什么编译器不能在每次迭代时省略调用.您的函数不接受任何参数的事实并不意味着它每次都必须返回相同的值.例如,它可以从流中输入一个数字并将其返回,或者它可以随机生成一个数字.
因此编译器在安全地消除调用之前需要非常小心.所以,如果功能很昂贵,你一定要预先存储它的价值.