月曜日, 21 2 月 2005

gjc VS jvm
この記事をクリップ!
このエントリーをはてなブックマークに追加

« Your Control: TunesでiTunes制御 | Main | いざという時のBusyBox »
GNUのJavaコンパイラ、gcjがどれくらい速いのかちょっと試してみた。
以下のコードをサンプルとして使用。内容は50万個のオブジェクトを生成し、配列に順次入れていくというだけの簡単なもの。オブジェクトの生成コスト知りたかったので。
public class test{
  static final int SIZE=500000;

  public static void main(String[] args){
    long start=System.currentTimeMillis();

    testObj[] list=new testObj[SIZE];

    for(int i=0;i<SIZE;i++)
      list[i]=new testObj(i);

    long end=System.currentTimeMillis();

    System.out.println("takes "+(end-start)+" ms");
  }

  public static class testObj{
    private int _i;

    public testObj(int i){
      this._i=i;
    }
  }
}

実行環境: RH Linux 7.3(kernel 2.4.28)
Intel Celeron 1.70GHz 1GB Memory

・jvm (Sun J2SDK1.4.2_06)
$ javac test.java
$ java -cp . test
takes 313 ms

・gcj (3.3.2)
$ gcj --main=test test.java
$ gcj --main=test -o test test.java
$ ./test
takes 160 ms
これだけを見るとgcjでコンパイルしたネイティブコードの方が速いように見えるが、jvmの方はヒープの割り当てをデフォルトのままで実行しているのでこれをGCが発生しない量に設定し再度実行してみる。
$ java -Xms200m -Xmx200m -cp . test
takes 50 ms
GCさせななければjvmの方が圧倒的に速いようだ。
ただ現実的には余程簡単なプログラムでない限り無いGCの発生を無くすことはできないし、通常の込み入ったプログラムを使用した場合にも結果は変わってくるので比較結果はこの限りではないと思う。
Posted by tsujitako at 1:05 午前 in Java/