BigDecimal 构造函数性能 - 字符串与数字

BigDecimal constructor performance - string vs numeric

new BigDecimal("10000");
new BigDecimal(10000);

我知道如果数字大于编译器接受的数字,则使用字符串构造函数,但是构造函数中的任何一个都比另一个快吗?

String 传递给 BigDecimal 的构造函数需要解析 String 并逐个检查字符。

传递 int 更快,因为它只产生一次赋值。

无论如何,时差并不重要。

这里是带有 int 参数的 BigDecimal 的代码:

public BigDecimal(int val) {
    intCompact = val;
}

带有 String 调用 BigDecimal(char[], int, int)BigDecimal 构造函数的代码大约有 140 行代码。

自己找出时差并分析。喜欢 :-

BigDecimal big = null;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    big = new BigDecimal("10000");
}
long endTime = System.currentTimeMillis();
System.out.println("time Taken In String : " + (endTime - startTime));

startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    big = new BigDecimal(10000);
}
endTime = System.currentTimeMillis();
System.out.println("time Taken in Numeric : " + (endTime - startTime));

PS:- 请考虑 垃圾收集 。以上代码仅供参考。

构造函数 new BigDecimal(10000) 应该更快,因为它不必将字符串转换为数字。在引擎盖下必须进行强制转换或对字符串函数的另一个调用,这会导致一些额外的开销。

public class benchmark {

    public static void main(String [ ] args) {
        timeFunction();
    }

static void timeFunction() {
     long startTime = System.nanoTime();

     BigDecimal v1 = new BigDecimal("10000");
     System.out.println("new BigDecimal(\"10000\") : " + (System.nanoTime() - startTime) / 1000000 + " ms");

     startTime = System.nanoTime();

     BigDecimal v2 = new BigDecimal(10000);
     System.out.println("new BigDecimal(10000) : " + (System.nanoTime() - startTime) / 1000000 + " ms");
}

}

输出

new BigDecimal("10000") : 4 ms
new BigDecimal(10000) : 0 ms

I know the string constructor is used if the number is bigger than the compiler would accept

这不是使用 String 构造函数的唯一原因。使用 String 构造函数的另一个原因是在创建 BigDecimal 时保持值不变。

如果你真的不关心精度,你应该坚持使用 double 而不是 BigDecimal

but are either of the constructors faster than the other

这是您必须通过对代码进行基准测试来发现的东西。也就是说,您应该更喜欢使用 valueOf 方法而不是创建新的 BigDecimal,因为 valueOf 将 return 缓存值。 (目前,这个范围从 0 到 10,但对于不同的 JVM 实现和 HotSpot VM 的未来实现,这个范围可能更高,所以你最好使用 valueOf

你可以看看源码

public BigDecimal(int val) {
    intCompact = val;
}

public BigDecimal(String val) {
    this(val.toCharArray(), 0, val.length());
}

public BigDecimal(char[] in, int offset, int len) {
       ...very long
}

很明显,谁更快