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