将BigDecimal乘以100哪种方法更好?

Eri*_*c.Q 6 java bigdecimal

在使用Java BigDecimal时,我有一个问题。当我要将100乘以BigDecimal的对象时,哪种方法会更好。

  1. 乘以10两次;
  2. movePointRight(2);
  3. scaleByPowerOfTen(2);
  4. 还有其他方法吗?请告诉我是否有。

顺便说一句,它将用于商业计算,所以我考虑的是精度而不是速度。

Jas*_*son 8

选项 3 是最快的。选项 1 和 2 大致相同(选项 1 是乘以 10 两次)。相反,乘以 100 可以达到接近选项 3 的速度。

这是我的测试代码:

import java.math.BigDecimal;

public class TestingStuff {

    public static void main(String[] args){
        BigDecimal d2 = new BigDecimal(0); // to load the big decimal class outside the loop
        long start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.movePointRight(2);
        }
        long end = System.currentTimeMillis();
        System.out.println("movePointRight: " + (end - start));

        BigDecimal ten = new BigDecimal(10);
        start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.multiply(ten).multiply(ten);
        }
        end = System.currentTimeMillis();
        System.out.println("multiply: " + (end - start));

        start = System.currentTimeMillis();
        for(int i = 0; i < 1000000; i++) {
            BigDecimal d = new BigDecimal(99);
            d2 = d.scaleByPowerOfTen(2);
        }
        end = System.currentTimeMillis();
        System.out.println("scaleByPowerOfTen: " + (end - start));
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,您可以在自己的代码中亲自尝试各种选项。如果你无法衡量差异,那你为什么要优化呢?

  • 我觉得有必要指出您的测试[不健壮](http://www.ibm.com/developerworks/library/j-benchmark1/)。使用 currentTimeMillis,不对结果执行任何操作,以便编译器可以自由地重构所有内容,并且 BigDecimal 类会加载到第一个循环内。 (6认同)
  • 该基准测试的另一个问题是它不允许 JVM 预热效果。 (2认同)