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
評価内容
- intをintへ代入 (int2int)
- intをIntegerへ代入 (int2Integer)
- Integerをintへ代入 (Integer2int)
- IntegerをIntegerへ代入 (Integer2Integer)
- longをlongへ代入 (long2long)
- longをLongへ代入 (long2Long)
- Longをlongへ代入 (Long2long)
- LongをLongへ代入 (Long2Long)
- doubleをdoubleへ代入 (double2double)
- doubleをDoubleへ代入 (double2Double)
- Doubleをdoubleへ代入 (Double2double)
- DoubleをDoubleへ代入 (Double2Double)
実行結果
評価項目 | 経過時間(μ秒) |
---|---|
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 まで。