有名な話。

結構有名な話だが、最近のJ2SDKでも有効なのか試してみた。

public class test1{
 public static void main(String args[]){
  for(int i=0; i<10; i++){
  }
 }
}

見たまんまの意です。
コンパイルして、できたクラスファイルを逆コンパイルすると以下の様になる。
メイン関数の呼び出しの部分のみ抜粋。

0 iconst_0
1 istore_1
2 goto 8
5 iinc 1 1
8 iload_1
9 bipush 10
11 if_icmplt 5
14 return
合計命令8セット。

次に、同じ意味を成すコードを以下の用に書いてみた。

public class test1{
 public static void main(Strin args[]){
  for(int i=9; i>=0; i–){
  }
 }
}

上記をコンパイルし、逆コンパイルした結果がコレ。
上と同様にメイン関数の呼び出しの部分のみ抜粋。

0 bipush 9
2 istore_1
3 goto 9
6 iinc 1 -1
9 iload_1
10 ifge 6
13 return
合計命令7セット。

命令セット数を1つ削減できる。・・・けど何故?
数の大きいループだと効果ありそうです。
もっとも中でループ変数を使うと命令セット数が代わるのかも知れませんが。