BigDecimalのパフォーマンスの問題
1917 ワード
浮動小数点数には精度損失の問題があることを知っており,精度の問題のために浮動小数点数を直接使用しないことが多く,BigDecimalを用いて浮動小数点数を置き換えることが多い.本文は主にBigDecimalがdoubleの性能に比べて存在する可能性のあるいくつかの問題を探求したい.
そこで簡単なテストプログラムを書きました:(注:以下のテストは純粋なテストと比較のためです!)
実行結果は次のとおりです.
result by BigDecimal:1346400.00038148 time used:365847335 result by Double:1346400.000387465 time used:5361855 timeUsed1/timeUsed2=68
結果的にBigDecimalは精度の向上をもたらしたが,性能上の損失は大きい.同じ演算時間がdoubleの68倍になるなんて.
私のアルゴリズムも道理で、doubleは数分で終わり、BigDecimalで数時間かかりました.
以上のテストの结果が頼りになることを知りませんか???
それとも私はBigDecimalの使い方に間違いがありますか?
そこで簡単なテストプログラムを書きました:(注:以下のテストは純粋なテストと比較のためです!)
import java.math.BigDecimal;
public class BigDecimalEfficiency {
public static int REPEAT_TIMES = 1000000;
public static double computeByBigDecimal(double a, double b) {
BigDecimal result = BigDecimal.valueOf(0);
BigDecimal decimalA = BigDecimal.valueOf(a);
BigDecimal decimalB = BigDecimal.valueOf(b);
for (int i = 0; i < REPEAT_TIMES; i++) {
result = result.add(decimalA.multiply(decimalB));
}
return result.doubleValue();
}
public static double computeByDouble(double a, double b) {
double result = 0;
for (int i = 0; i < REPEAT_TIMES; i++) {
result += a * b;
}
return result;
}
public static void main(String[] args) {
long test = System.nanoTime();
long start1 = System.nanoTime();
double result1 = computeByBigDecimal(0.120000000034, 11.22);
long end1 = System.nanoTime();
long start2 = System.nanoTime();
double result2 = computeByDouble(0.120000000034, 11.22);
long end2 = System.nanoTime();
long timeUsed1 = (end1 - start1);
long timeUsed2 = (end2 - start2);
System.out.println("result by BigDecimal:" + result1);
System.out.println("time used:" + timeUsed1);
System.out.println("result by Double:" + result2);
System.out.println("time used:" + timeUsed2);
System.out.println("timeUsed1/timeUsed2=" + timeUsed1 / timeUsed2);
}
}
実行結果は次のとおりです.
result by BigDecimal:1346400.00038148 time used:365847335 result by Double:1346400.000387465 time used:5361855 timeUsed1/timeUsed2=68
結果的にBigDecimalは精度の向上をもたらしたが,性能上の損失は大きい.同じ演算時間がdoubleの68倍になるなんて.
私のアルゴリズムも道理で、doubleは数分で終わり、BigDecimalで数時間かかりました.
以上のテストの结果が頼りになることを知りませんか???
それとも私はBigDecimalの使い方に間違いがありますか?