Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal构造函数性能-字符串与数字_Java_Performance_Bigdecimal - Fatal编程技术网

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

Java BigDecimal构造函数性能-字符串与数字,java,performance,bigdecimal,Java,Performance,Bigdecimal,我知道如果数字大于编译器可以接受的值,则会使用字符串构造函数,但是两个构造函数中的任何一个都比另一个快吗?将字符串传递给bigdecim的构造函数需要对字符串进行解析并逐字符检查 传递int更快,因为它只导致一个赋值 在任何情况下,时间差都不显著 这里是带有int参数的BigDecimal代码: new BigDecimal("10000"); new BigDecimal(10000); 带有String的BigDecimal构造函数的代码调用BigDecimal(char[],int,in

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

字符串
传递给
bigdecim
的构造函数需要对
字符串进行解析并逐字符检查

传递int更快,因为它只导致一个赋值

在任何情况下,时间差都不显著

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

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

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

String
传递给
BigDecimal
的构造函数需要对
字符串进行解析并逐字符检查

传递int更快,因为它只导致一个赋值

在任何情况下,时间差都不显著

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

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

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

自己查找时差并进行分析。比如:-

public BigDecimal(int val) {
    intCompact = val;
}
bigdecim big=null;
long startTime=System.currentTimeMillis();
对于(int i=0;i<10000;i++){
大=新的大十进制(“10000”);
}
long-endTime=System.currentTimeMillis();
System.out.println(“字符串中占用的时间:+(endTime-startTime));
startTime=System.currentTimeMillis();
对于(int i=0;i<10000;i++){
大=新的大十进制(10000);
}
endTime=System.currentTimeMillis();
System.out.println(“以数字表示的时间:+(endTime-startTime));

PS:-考虑垃圾收集。只考虑上面的代码作为参考。

< P>查找你自己的时差并分析。比如:-

public BigDecimal(int val) {
    intCompact = val;
}
bigdecim big=null;
long startTime=System.currentTimeMillis();
对于(int i=0;i<10000;i++){
大=新的大十进制(“10000”);
}
long-endTime=System.currentTimeMillis();
System.out.println(“字符串中占用的时间:+(endTime-startTime));
startTime=System.currentTimeMillis();
对于(int i=0;i<10000;i++){
大=新的大十进制(10000);
}
endTime=System.currentTimeMillis();
System.out.println(“以数字表示的时间:+(endTime-startTime));

PS:-考虑垃圾收集。只考虑上面的代码作为参考。

< P>构造函数新BigDePiple(10000)应该更快,因为它不必将字符串转换成数字。在幕后,必须对字符串函数进行强制转换或其他调用,这将导致额外的开销

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));
输出

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)应该更快,因为它不必将字符串转换为数字。在幕后,必须对字符串函数进行强制转换或其他调用,这将导致额外的开销

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));
输出

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");
}

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

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

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

但是两个构造函数中的任何一个都比另一个快吗

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

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

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

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

但是两个构造函数中的任何一个都比另一个快吗


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

您可以查看源代码

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

显然,谁更快。

您可以查看源代码

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

显然,谁跑得更快。

你为什么不自己试试呢?调用这些构造函数数千次并测量所需的时间。也许你会读到以下内容:根据这个SQ问题,双构造函数被弃用:@bish这里没有人使用这个构造函数,所以这并不重要:)@MCMastery,打开class
BigDecimal
并比较这两个构造函数,有什么问题吗?你为什么不自己试试呢?调用这些构造函数数千次并测量所需的时间。也许你会读到:根据这个SQ问题,双构造函数被弃用:@bish这里没有人使用这个构造函数,所以这并不重要:)。@MCMastery,打开class
BigDecimal
,比较这两个构造函数,有什么问题吗?代码基准可能会受到垃圾收集器的严重影响。