アプリケーションで速度に敏感な計算をたくさん行っているので、オートボクシングとパフォーマンスに興味があったので、少しテストを実行しました...
public static void main(String[] args) {
// Some initialization so I know it's not involved
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
int[] regArray = new int[1];
long total = 0;
// This one uses an array and primitive type
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
regArray[0] = i + 10;
if (regArray[0] % 1000 == 0) total += regArray[0];
}
System.out.println("Runtime in millis: " + (System.currentTimeMillis() - start));
System.out.println(total);
// This one autoboxes, but still uses the Object type because it's a list
total = 0;
start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
list.set(0, i + 10);
if (list.get(0) % 1000 == 0) total += list.get(0);
}
System.out.println("Runtime in millis: " + (System.currentTimeMillis() - start));
System.out.println(total);
// This one doesn't autobox
total = 0;
start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
list.set(0, new Integer(i + 10));
if (list.get(0).intValue() % 1000 == 0) total += list.get(0).intValue();
}
System.out.println("Runtime in millis: " + (System.currentTimeMillis() - start));
System.out.println(total);
}
出力例は次のとおりです。
Runtime in millis: 78
50005000000
Runtime in millis: 250
50005000000
Runtime in millis: 250
50005000000
List<>
これは、速度に敏感なマシーなアプリケーションから離れてサブクラスを作成する必要があることを示唆しているようです。同意しますか、stackoverflow?
編集:私の実際のユースケースは、頻繁に、そしてほとんど予測できないほど変化する数百int
秒を保存する必要があるというfloat
ことです(私はそれらが狭い範囲内にとどまるために主に言いますが、それらがその中で何をするかわかりません狭い範囲)、これらの数値を計算するには、ミリ秒単位の応答時間が必要です。