スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

Javaコンパイラに最適化されたコードを逆コンパイルしてみる

Javaコンパイラの最適化がどのようなケースにおいて働くか、Javaの逆コンパイラJadを使用して検証してみました。

コンパイル前のコード

public class Optimization {
  public static void main(String args[]) { 
    System.out.println(1+1);

    int a = 1;
    System.out.println(a+1);

    int b;
    b = 1;
    System.out.println(b+1);

    int c = 1;
    System.out.println(c++);

    final int d = 1;
    System.out.println(d+1);

    int e = 1;
    System.out.println(f(e));

    System.out.println(f(1));

    System.out.println(g());

    C1 c1 = new C1(1);
    System.out.println(c1.i);
    System.out.println(c1.get());

    /* 貼り付けたプログラムに間違いがありました。
     * (実行したプログラムは正しいです) */
    C1C2 c2 = new C1C2(1);
    System.out.println(c2.i);
    System.out.println(c2.get());

    /* 貼り付けたプログラムに間違いがありました。
     * (実行したプログラムは正しいです) */
    C1C3 c3 = new C1C3(1);
    System.out.println(c3.i);
    System.out.println(c3.get());

    /* 貼り付けたプログラムに間違いがありました。
     * (実行したプログラムは正しいです) */
    C1C4 c4 = new C1C4(1);
    System.out.println(c4.i);
    System.out.println(c4.get());
  }
	
  private static int f(int x) {
    return x++;
  }

  /* 貼り付ける際に抜けていました。*/
  private static int g() {
    return 2;
  }
}

class C1 {
  int i;
  C1(int i) {
    this.i = i;
  }
  public int get() {
    return i;
  }
}

class C2 {
  final int i;
  C2(int i) {
    this.i = i;
  }
  public int get() {
    return i;
  }
}

class C3 {
  private final int i;
  C3(int i) {
    this.i = i;
  }
  public int get() {
    return i;
  }
}

final class C4 {
  private final int i;
  C4(int i) {
    this.i = i;
  }
  public int get() {
    return i;
  }
}

逆コンパイルによって得られたコード

import java.io.PrintStream;

public class Optimization
{

    public Optimization()
    {
    }

    public static void main(String args[])
    {
        System.out.println(2);
        int a = 1;
        System.out.println(a + 1);
        int b = 1;
        System.out.println(b + 1);
        int c = 1;
        System.out.println(c++);
        int d = 1;
        System.out.println(2);
        int e = 1;
        System.out.println(f(e));
        System.out.println(f(1));
        System.out.println(g());
        C1 c1 = new C1(1);
        System.out.println(c1.i);
        System.out.println(c1.get());
        C2 c2 = new C2(1);
        System.out.println(c2.i);
        System.out.println(c2.get());
        C3 c3 = new C3(1);
        System.out.println(c3.get());
        C4 c4 = new C4(1);
        System.out.println(c4.get());
    }

    private static int f(int x)
    {
        return x++;
    }

    private static int g() {
        return 2;
    }
}

class C1
{

    C1(int i)
    {
        this.i = i;
    }

    public int get()
    {
        return i;
    }

    int i;
}

class C2
{

    C2(int i)
    {
        this.i = i;
    }

    public int get()
    {
        return i;
    }

    final int i;
}

class C3
{

    C3(int i)
    {
        this.i = i;
    }

    public int get()
    {
        return i;
    }

    private final int i;
}

final class C4
{

    C4(int i)
    {
        this.i = i;
    }

    public int get()
    {
        return i;
    }

    private final int i;
}

コンパイル時の最適化

  • 定数同士の計算は最適化される。
  • 変数の値は最適化されない。
  • でも、finalをつければ最適化される。(→定数にはfinalをつけよう!)
  • 宣言と同時に初期化しなかった場合 (int b; b = 1; )でも、宣言と同時に初期化される。
  • 関数呼び出しは最適化されない。たとえ、その戻り値が定数であっても。
  • オブジェクトの参照は最適化されない。たとえ、そのオブジェクトが不変であっても。

関連する記事


スポンサード リンク

テーマ:プログラミング - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

23 : 12 : 49 | プログラミング-Java | トラックバック(0) | コメント(2) | page top↑
<<防水のmicroSD | ホーム | 式の計算結果を一時変数に格納することによるパフォーマンスの向上>>
コメント

メソッドが最適化されないのは、サブクラスからアクセスできたりするからっしょ

finalなメソッドだとどうなるの??
by: isocchi * 2008/12/23 22:59 * URL [ 編集] | page top↑

>いそっち

メソッドはfinalかつprivateにしても最適化されないっぽい。

<コンパイル前>

public final class Optimization2 {
public static void main(String args[]) {
int e = 1;
System.out.println(f(e));

System.out.println(f(1));

System.out.println(g());

C5 c5 = new C5(1);
System.out.println(c5.get());

C6 c6 = new C6();
System.out.println(c6.get());
System.out.println(C6.get2());
}

private static final int f(int x) {
return x++;
}

private static final int g() {
return 2;
}
}

final class C5 {
private final int i;
C5(int i) {
this.i = i;
}
public final int get() {
return i;
}
}

final class C6 {
public final int get() {
return 2;
}
public static final int get2() {
return 2;
}
}


<逆コンパイル後>

import java.io.PrintStream;

public final class Optimization2
{

public Optimization2()
{
}

public static void main(String args[])
{
int e = 1;
System.out.println(f(e));
System.out.println(f(1));
System.out.println(g());
C5 c5 = new C5(1);
System.out.println(c5.get());
C6 c6 = new C6();
System.out.println(c6.get());
System.out.println(C6.get2());
}

private static final int f(int x)
{
return x++;
}

private static final int g()
{
return 2;
}
}

final class C5
{

C5(int i)
{
this.i = i;
}

public final int get()
{
return i;
}

private final int i;
}

final class C6
{

C6()
{
}

public final int get()
{
return 2;
}

public static final int get2()
{
return 2;
}
}
by: TBVector * 2008/12/24 00:04 * URL [ 編集] | page top↑

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/114-96f098d6
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。