繁体   English   中英

for 循环的“计数限制”表达式是只计算一次,还是每次迭代?

[英]Will the "count limit" expression of a for-loop be evaluated only once, or on each iteration?

如果我在循环的条件语句中调用一个方法,它会在每次循环迭代中被调用吗?

例如:

for( int i = 0; i <= expensiveComputation(); i++ ) {
    // Do something.
}

我会在每次迭代中执行expensiveComputation()吗? 还是会在初始化循环变量的同时在每次迭代中存储和使用expensiveComputation()的结果?

我应该改写它吗:

int max = expensiveComputation();
for ( int i = 0; i <= max; i++ ) {
    // Do something.
}

它将在每次迭代时被调用,除非编译器/优化器决定它没有副作用并且可以消除调用作为优化。

我的意思是,编译器不能只是盲目地存储值,因为 java 中的函数与数学函数不同,它不仅可以有返回值,还可以有诸如将某些内容打印到某些流或更改某些全局状态等副作用。

编译器每次迭代都不能省略调用还有另一个原因。 您的函数不接受任何参数这一事实并不意味着它每次都必然返回相同的值。 例如,它可以从流中输入一个数字并返回它,或者它可以随机生成一个数字。

所以编译器需要非常小心,才能安全地消除调用。 所以,如果函数很昂贵,你绝对应该预先存储它的值。

如果不需要在每次迭代时计算计算,则第二个选项更好


如果你假设你的循环长度为 n 并且你的计算是 O(n)。
对于第一个解决方案,复杂度为O(n 2 )而另一个为O(2n)

它可能会或可能不会在每次迭代时被调用,这取决于编译器想要发出的字节码。 很可能实际上每次都会调用它。

如果要确保在每次迭代时都不会调用它,请使用int max = ...版本。

为什么不简单地自己测试一下?

是的,您应该在这些情况下缓存您的结果,以确保更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM