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

Jav*_*vaL 0 java optimization coding-style

例如

int offset = getOffset();
int count = getCount();
int limit = count + offset;
for (int i; i < limit; i++) {}
Run Code Online (Sandbox Code Playgroud)

更优选

int offset = getOffset();
int count = getCount();
for (int i; i < offset + count; i++) {}
Run Code Online (Sandbox Code Playgroud)

如果Java VM在每次迭代时都进行了添加,那听起来就像是一个很大的开销.但如果编译器足够聪明以限制单次添加,我想保持我的代码简短.

Swe*_*per 6

过早优化是万恶之源.

现在不用担心.


当您从循环中提取添加部分时,它确实只会被评估一次.有些编译器也可能足够聪明以优化它,但有些可能没有.

几乎所有CPU都需要添加32位整数所需的时间非常小.如果您使用了分析器并发现for循环条件确实导致了性能问题,那么您应该将其添加出去并查看它是否有帮助.但是当你甚至没有发现问题时,没有必要担心它.


所以现在,根据你脑子里的想法编写你的代码.对我来说,例如,如果我在想"现在我需要重复这个(偏移+计数)次......",我会写

for (int i = 0 ; i < offset + count ; i++)
Run Code Online (Sandbox Code Playgroud)

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

int limit = offset + count;
for (int i = 0 ; i < limit ; i++)
Run Code Online (Sandbox Code Playgroud)