コンストラクターを使用してBigIntegerオブジェクトを構築する際のパフォーマンス/複雑さについて疑問に思っています。new BigInteger(String)
次の方法を検討してください。
public static void testBigIntegerConstruction()
{
for (int exp = 1; exp < 10; exp++)
{
StringBuffer bigNumber = new StringBuffer((int) Math.pow(10.0, exp));
for (int i = 0; i < Math.pow(10.0, exp - 1); i++)
{
bigNumber.append("1234567890");
}
String val = bigNumber.toString();
long time = System.currentTimeMillis();
BigInteger bigOne = new BigInteger(val);
System.out.println("time for constructing a 10^" + exp
+ " digits BigInteger : " + ((System.currentTimeMillis() - time))
+ " ms");
}
}
このメソッドは、最初に数字BigInteger
を含む文字列のオブジェクトを作成し、反復ごとに増加します。対応するオブジェクトの構築に必要な時間を計測して出力します。10^x
x=1
BigInteger
私のマシン (Intel Core i5 660、JDK 6 Update 25 32 ビット) での出力は次のとおりです。
time for constructing a 10^1 digits BigInteger : 0 ms
time for constructing a 10^2 digits BigInteger : 0 ms
time for constructing a 10^3 digits BigInteger : 0 ms
time for constructing a 10^4 digits BigInteger : 16 ms
time for constructing a 10^5 digits BigInteger : 656 ms
time for constructing a 10^6 digits BigInteger : 59936 ms
time for constructing a 10^7 digits BigInteger : 6227975 ms
10^5 までの行を無視している間 ((プロセッサ) キャッシュ効果、JIT コンパイルなどによって歪みが生じる可能性があるため)、ここで O(n^2) の複雑さをはっきりと見ることができます。でのすべての操作は、BigInteger
不変性により新しいものを作成することに注意してください。これは、巨大な数の場合、パフォーマンスが大幅に低下します。
質問:
私は何か見落としてますか?
これはなぜですか?
これは最近のJDKで修正されていますか?
代替手段はありますか?
アップデート:
私はさらに測定を行い、いくつかの回答から声明を確認することができます:
それはBigInteger
、私にとって合理的と思われる膨大な数の建設コストを犠牲にして、その後の数値演算に最適化されているようです.