【性能】Java BigDecimal和double性能比较

来源:互联网 发布:淘宝卖家旺旺名怎么改 编辑:程序博客网 时间:2024/06/03 09:50

        我们知道 java 里面有个 BigDecimal ,可以解决我们的精度丢失问题。

但是很少关注其性能情况,因为一般来说可以忽略不计的。

也确实,解决大数据量运算 java 本身并不适合。

 

本人愚笨,很早之前用 java 解决一个大数据量运算的算法,对性能要求很高。中间用了 BigDecimal ,注意到其性能的一些情况,发现其性能是 double 的 100 倍左右。

具体没有去深究其原因,平时其实也不用对这个在意,但是对这个知识做个基本的了解还是有必要的。

 

直接上代码:

 

Java代码  收藏代码
  1. import java.math.BigDecimal;  
  2.   
  3. public class BigDecimalEfficiency {  
  4.   
  5.     public static int REPEAT_TIMES = 1000000;  
  6.   
  7.     public static double computeByBigDecimal(double a, double b) {  
  8.         BigDecimal result = BigDecimal.valueOf(0);  
  9.         BigDecimal decimalA = BigDecimal.valueOf(a);  
  10.         BigDecimal decimalB = BigDecimal.valueOf(b);  
  11.         for (int i = 0; i < REPEAT_TIMES; i++) {  
  12.             result = result.add(decimalA.multiply(decimalB));  
  13.         }  
  14.         return result.doubleValue();  
  15.     }  
  16.   
  17.     public static double computeByDouble(double a, double b) {  
  18.         double result = 0;  
  19.         for (int i = 0; i < REPEAT_TIMES; i++) {  
  20.             result += a * b;  
  21.         }  
  22.         return result;  
  23.     }  
  24.   
  25.     public static void main(String[] args) {  
  26.         long test = System.nanoTime();  
  27.         long start1 = System.nanoTime();  
  28.         double result1 = computeByBigDecimal(0.12000000003411.22);  
  29.         long end1 = System.nanoTime();  
  30.         long start2 = System.nanoTime();  
  31.         double result2 = computeByDouble(0.12000000003411.22);  
  32.         long end2 = System.nanoTime();  
  33.   
  34.         long timeUsed1 = (end1 - start1);  
  35.         long timeUsed2 = (end2 - start2);  
  36.         System.out.println("result by BigDecimal:" + result1);  
  37.         System.out.println("time used:" + timeUsed1);  
  38.         System.out.println("result by Double:" + result2);  
  39.         System.out.println("time used:" + timeUsed2);  
  40.   
  41.         System.out.println("timeUsed1/timeUsed2=" + timeUsed1 / timeUsed2);  
  42.     }  
  43. }  
 

 

结果:

 

result by BigDecimal:1346400.00038148
time used:572537012
result by Double:1346400.000387465
time used:5280000
timeUsed1/timeUsed2=108

 

对比图:

  

 

从以上结果来看,bigDecimal的性能可见一斑。其性能竟然是double的100倍,这是很早之前没想到的。

0 0
原创粉丝点击