add
メソッドが何をしているのかわからないので、コンパイラは多くのことができません。ループのボディのコードが生成されます。ご覧のとおり、add
を呼び出して結果を保存するだけです。
25: iload 5
27: iload 4
29: if_icmpge 51
32: aload_3
33: iload 5
35: aaload
36: astore 6
38: aload_1
39: aload 6
41: invokevirtual #5; //Method java/math/BigInteger.add:(Ljava/math/BigInteger;)Ljava/math/BigInteger;
44: astore_1
45: iinc 5, 1
48: goto 25
理論上、Java仮想マシンランタイムシステムはもっと賢いことがあります。例えば、1つのオブジェクトが割り当てられたばかりのオブジェクトを上書きし続けるのを検出し、2つの割り当てバッファをスワップするだけで済みます。私たちは、ガベージコレクションのログを有効にして、次のプログラムを実行することによって見ることができるようにしかし、これは
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Random;
class Test {
public static void main(String[] args) {
ArrayList <BigInteger> nums = new ArrayList<BigInteger>();
final int NBITS = 100;
final int NVALS = 1000000;
System.out.println("Filling ArrayList");
Random r = new Random();
for (int i = 0; i < NVALS; i++)
nums.add(new BigInteger(NBITS, r));
System.out.println("Adding ArrayList values");
BigInteger A = new BigInteger("0");
for(BigInteger n : nums) {
A = A.add(n);
}
System.gc();
}
}
は、ガベージコレクションが追加処理中に呼び出して表示されない場合悲しそうです。
C:\tmp>java -verbose:gc Test
Filling ArrayList
[GC 16256K->10471K(62336K), 0.0257655 secs]
[GC 26727K->21107K(78592K), 0.0304749 secs]
[GC 53619K->42090K(78592K), 0.0567912 secs]
[Full GC 42090K->42090K(122304K), 0.1019642 secs]
[GC 74602K->65857K(141760K), 0.0601406 secs]
[Full GC 65857K->65853K(182144K), 0.1485418 secs]
Adding ArrayList values
[GC 117821K->77213K(195200K), 0.0381312 secs]
[GC 112746K->77245K(228288K), 0.0111372 secs]
[Full GC 77245K->137K(228288K), 0.0327287 secs]
C:\tmp>java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)
これは、いくつかの方法で間接的に最適化することができます。例えば、*ほとんどの新しいインスタンスは、非常に短期間で非常に短期間で生き残り、決してそのメソッドを残さないため、メモリの割り当て方法を最適化します。これは、このコードのパフォーマンスを予測することは非常に難しいことを意味します。このコードがボトルネックであることをベンチマーク*して証明しましたか? –
変更可能なIntegerクラスを使用する必要がある場合は、以下を参照してください:[package org.apache.commons.lang.mutable](http://commons.apache.org/lang/api-2.4/org/) apache/commons/lang/mutable/package-summary.html)を参照してください。 – anubhava
@anubhava:これらのクラスに気づくのは良いことですが、私は彼らがこの質問にどのように役立つかは分かりません。 – NPE