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
}
很明显,谁更快
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
}
很明显,谁更快