Java > ラッパークラスのオーバーヘッド

更新日 2011-12-03
広告

プリミティブ型をラッパークラスに変換(ボクシング)する処理や、ラッパークラスをプリミティブ型に変換(アンボクシング)する処理の性能を評価します。

評価環境

  • Java 1.6.0 (IcedTea6 1.9.10), OpenJDK 64-Bit Server VM.
  • Ubuntu 10.10
  • Intel(R) Core(TM)2 Duo CPU E7600 @ 3.06GHz

評価内容

  1. intをintへ代入 (int2int)
  2. intをIntegerへ代入 (int2Integer)
  3. Integerをintへ代入 (Integer2int)
  4. IntegerをIntegerへ代入 (Integer2Integer)
  5. longをlongへ代入 (long2long)
  6. longをLongへ代入 (long2Long)
  7. Longをlongへ代入 (Long2long)
  8. LongをLongへ代入 (Long2Long)
  9. doubleをdoubleへ代入 (double2double)
  10. doubleをDoubleへ代入 (double2Double)
  11. Doubleをdoubleへ代入 (Double2double)
  12. DoubleをDoubleへ代入 (Double2Double)
上記の処理を、それぞれ1万回実施して、経過時間を計測します。

実行結果

評価項目 経過時間(μ秒)
int2int 142
int2Integer 542
Integer2int 248
Integer2Integer 139
long2long 125
long2Long 612
Long2long 480
Long2Long 139
double2double 125
double2Double 1623
Double2double 403
Double2Double 139

ラッパークラスからプリミティブ型への代入よりも、プリミティブ型からラッパークラスへの代入のほうが時間がかかっています。 今回の評価の中では、プリミティブ型からラッパークラスへの代入の際に限り、(ラッパークラスの)オブジェクト生成が発生するので、納得の結果です。

intとlongの処理に大差はありませんでした。64bit CPUのおかげかもしれません。 一方、doubleをDoubleに代入する処理はかなり遅いです。Doubleオブジェクトの生成が高コストであることを物語っています。

評価に利用したプログラム

import java.text.*;

public class PrimitiveVsWrapper {
    // ループ回数
    private static final int LOOP = 10000;

    public static void main(String[] args) {
    	DecimalFormat df = new DecimalFormat("0");
        df.setMaximumIntegerDigits(5);
        df.setMinimumIntegerDigits(5);

    	long time;
	
    	time = int2int(LOOP);
    	System.out.println("int2int        " + df.format(time / 1000) + " micro second");

    	time = int2Int(LOOP);
    	System.out.println("int2Int        " + df.format(time / 1000) + " micro second");

    	time = Int2int(LOOP);
    	System.out.println("Int2int        " + df.format(time / 1000) + " micro second");

    	time = Int2Int(LOOP);
    	System.out.println("Int2Int        " + df.format(time / 1000) + " micro second");

    	time = long2long(LOOP);
    	System.out.println("long2long      " + df.format(time / 1000) + " micro second");

    	time = long2Long(LOOP);
    	System.out.println("long2Long      " + df.format(time / 1000) + " micro second");

    	time = Long2long(LOOP);
    	System.out.println("Long2long      " + df.format(time / 1000) + " micro second");

    	time = Long2Long(LOOP);
    	System.out.println("Long2Long      " + df.format(time / 1000) + " micro second");

    	time = double2double(LOOP);
    	System.out.println("double2double  " + df.format(time / 1000) + " micro second");

    	time = double2Double(LOOP);
    	System.out.println("double2Double  " + df.format(time / 1000) + " micro second");

    	time = Double2double(LOOP);
    	System.out.println("Double2double  " + df.format(time / 1000) + " micro second");

    	time = Double2Double(LOOP);
    	System.out.println("Double2Double  " + df.format(time / 1000) + " micro second");

    }

    private static long int2int(int loop) {
    	int a = 0;
    	int b = 1;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Int2int(int loop) {
    	int a = 0;
    	Integer b = 1;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long int2Int(int loop) {
    	Integer a = 0;
    	int b = 1;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Int2Int(int loop) {
    	Integer a = 0;
    	Integer b = 1;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long long2long(int loop) {
    	long a = 0L;
    	long b = 1L;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Long2long(int loop) {
    	long a = 0L;
    	Long b = 1L;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long long2Long(int loop) {
    	Long a = 0L;
    	long b = 1L;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Long2Long(int loop) {
    	Long a = 0L;
    	Long b = 1L;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long double2double(int loop) {
    	double a = 0.0;
    	double b = 1.0;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Double2double(int loop) {
    	double a = 0.0;
    	Double b = 1.0;
    
    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long double2Double(int loop) {
    	Double a = 0.0;
    	double b = 1.0;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

    private static long Double2Double(int loop) {
    	Double a = 0.0;
    	Double b = 1.0;

    	long s = System.nanoTime();
    	for (int i = 0; i < loop; i++) {
    	    a = b;
    	}
    	long f = System.nanoTime();
    	return (f - s);
    }

}
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system