减少循环的最佳习语

Law*_*Dol 4 java

减少循环的最佳/首选习惯是什么?为什么?

for(int idx=(len-1); idx>=0; idx--) {...}
Run Code Online (Sandbox Code Playgroud)

要么

for(int idx=(len-1); idx>-1; idx--) {...}
Run Code Online (Sandbox Code Playgroud)

或(基于sylvarking的答案,但用于约束索引范围)

for(int idx=len; idx-->0; ) {...}
Run Code Online (Sandbox Code Playgroud)

是否有一个或多个人更有可能绊倒另一个开发者?

eri*_*son 11

您可能会看到另一个面向数组的变体:

int n = foo.length;
while (n-- > 0) {
  /* Do something with foo[n] */
}
Run Code Online (Sandbox Code Playgroud)

在你展示的选项中,我更喜欢第一个.

  • 0是(可以说)更可读-1.
  • 与零比较通常比与其他常数相比更快.它是一条指令,用于检查堆栈中的单个值.其他比较使用一条指令将常量压入堆栈,另一条指令用于比较前两个值.

  • 我也喜欢这个版本,虽然我通常会选择`for(int i = a.length; i - > 0;)`idiom,如果它是一个简单的反向迭代器,它对循环没有做任何巧妙的事情变量或在那里有一个额外的'break`. (2认同)
  • 我不喜欢这样的一件事是n的范围大于循环; 使用for(int n ...更好地约束范围. (2认同)

Mat*_*ers 11

我推荐以下内容,因为在字节代码级别优化了与零的比较.

for(int idx=(len-1); idx>=0; idx--) {...}
Run Code Online (Sandbox Code Playgroud)

这是Jack Shirazi的Java Performance Tuning的建议

  • 进一步处理字节代码,如果不知道最后将执行哪些代码,则无法预测实际运行时间.我相信HotSpot非常适合优化int i = 0; 我<MAX; i ++案例. (2认同)