最好预先计算for循环的条件语句部分吗?

时间:2018-12-30 08:28:10

标签: java optimization coding-style

例如

int offset = getOffset();
int count = getCount();
int limit = count + offset;
for (int i; i < limit; i++) {}

更可取
int offset = getOffset();
int count = getCount();
for (int i; i < offset + count; i++) {}

如果Java VM在每次迭代中都执行添加操作,那么这听起来很麻烦。但是,如果编译器足够聪明,可以将添加次数限制为一次,那么我想使代码简短。

1 个答案:

答案 0 :(得分:6)

  

过早的优化是万恶之源。

现在不用担心。


当您从循环中提取加法部分时,它实际上只会被评估一次。有些编译器可能也足够聪明,可以对其进行优化,但有些可能不会。

几乎所有CPU进行32位整数加法的时间都非常短。如果您使用了探查器,并且发现for循环条件确实是 会导致性能问题,那么您应该删除附加内容,看看是否有帮助。但是,即使您没有/没有发现问题,也不必担心。


因此,现在,根据您的想法编写代码。例如,对我来说,如果我想“现在我需要重复(偏移+计数)次...”,我会写

for (int i = 0 ; i < offset + count ; i++)

如果我想“现在我需要计算循环次数,然后我将循环多次”,那么我会写:

int limit = offset + count;
for (int i = 0 ; i < limit ; i++)