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

时间:2015-07-05 15:59:46

标签: java performance bigdecimal

my_method

我知道如果数字大于编译器接受的数字,则使用字符串构造函数,但构造函数是否比其他构造函数更快?

5 个答案:

答案 0 :(得分:3)

您可以查看源代码。

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
}

显然,谁更快。

答案 1 :(得分:2)

String传递给BigDecimal的构造函数需要解析String和char查询字符。

传递int更快,因为它只产生一次分配。

在任何情况下,时差都不具有意义。

此处BigDecimal的代码带有int参数:

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

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

答案 2 :(得分:1)

构造函数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

答案 3 :(得分:1)

  

我知道如果数字大于编译器接受的数字,则使用字符串构造函数

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

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

  

但是其中一个构造函数比另一个

更快

您必须通过对代码进行基准测试来了解自己。话虽这么说,您应该更喜欢使用valueOf方法而不是创建新的BigDecimal,因为valueOf将返回缓存的值。 (目前,范围从0到10,但是对于不同的JVM实现和HotSpot VM的未来实现,此范围可能更高,因此您最好使用valueOf

答案 4 :(得分:0)

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

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: - 继续考虑垃圾收集。请将以上代码仅作为参考。