Posts Tagged ‘Autoboxing’

Autoboxing って便利だけど・・・

木曜日, 1 月 29th, 2009

今さらですけど JDK1.5 から採用された Autoboxing / Auto-Unboxing って便利ですよね。

しかし Effective Java 第2版を読みかけて、この便利な機能のおかげで知らないうちにとんでもないミスを犯す可能性があることを知りました。

本に載っていたコードはたった一文字、小文字であるべき所を大文字で記述してしまったため恐ろしく遅いプログラムとなってしまうということです。

私のような未熟者がやりそうなことです。

以下に Effective Java に載っていたサンプルプログラムを元に少し変更したコードを載せます。

package dotubo;

public class Main {

    public static void main(String[] args) {      
        System.out.println(“テスト開始\n”);
        Main m = new Main();
        m.slow();
        m.fast();
    }

    private void slow(){
        Long sum = 0L;
        for(long i = 0; i < Integer.MAX_VALUE; i++){
            sum += i;
        }
        System.out.println(“slow : ” + sum);

    }

    private void fast(){
        long sum = 0L;
        for(long i = 0; i < Integer.MAX_VALUE; i++){
            sum += i;
        }
        System.out.println(“fast : ” + sum);
    }

}

これはコンパイルも実行もできます。

ただし、slow() メソッドと fast() メソッドの処理時間が比べものにならないくらい違います。

slow() メソッドと fast() メソッドは見てのとおり微妙に一文字だけ肝心な所が違いますね。

たった一文字の間違いのために意図しない Autoboxing が働いて不必要な Long インスタンスを作ってしまいます。

NetBeans のプロファイラでこのプログラムのパフォーマンスを確認してみました。

1

間違っている slow() メソッドは 30224ms かかっているのに対して正しい fast() メソッドは 5561ms しかかかってません。

この違いはもの凄く大きい!です。

便利なものは正しく使わないとどつぼにはまるということですね。(^-^;

Hatena タグ: