我进行了一些Java运行时测试,发现了一种奇怪的行为。对于我的代码,我需要使用包装器对象来模拟原始类型(如int,double等)的输入和输出参数,但这不是重点。看看我的代码。如何使具有字段访问的对象比原始类型更快?
for
循环与原始类型:
public static void main(String[] args) {
double max = 1000;
for (int j = 1; j < 8; j++) {
double i;
max = max * 10;
long start = System.nanoTime();
for (i = 0; i < max; i++) {
}
long end = System.nanoTime();
long microseconds = (end - start) / 1000;
System.out.println("MicroTime primitive(max: ="+max + "): " + microseconds);
}
}
结果:
MicroTime基元(最大值:= 10000.0):110
MicroTime基元(最大值:= 100000.0):1081
MicroTime基元(最大值:= 1000000.0):2450
MicroTime基元(最大值:= 1.0E7):28248
MicroTime基元(最大值:= 1.0E8):276205
MicroTime基元(最大值:= 1.0E9):2729824
MicroTime基元(最大值:= 1.0E10):27547009
for
循环使用简单类型(包装对象):
public static void main(String[] args) {
HDouble max = new HDouble();
max.value = 1000;
for (int j = 1; j < 8; j++) {
HDouble i = new HDouble();
max.value = max.value*10;
long start = System.nanoTime();
for (i.value = 0; i.value <max.value; i.value++) {
}
long end = System.nanoTime();
long microseconds = (end - start) / 1000;
System.out.println("MicroTime wrapper(max: ="+max.value + "): " + microseconds);
}
}
结果:
MicroTime包装器(最大值:=10000.0):157
MicroTime包装器(最大值:=100000.0):1561
MicroTime包装器(最大值:=1000000.0):3174
MicroTime包装器(最大值:=1.0E7):15630
MicroTime包装器(最大值:=1.0E8):155471
MicroTime包装器(最大值:=1.0E9):1520967
MicroTime包装器(最大值:=1.0E10):15373311
迭代次数越多,第二个代码就越快。但是为什么?我知道java编译器和jvm正在优化我的代码,但我从未想过基本类型可能比具有字段访问的对象更慢。
有人对此有一个合理的解释吗?
编辑: HDouble类:
public class HDouble {
public double value;
public HDouble() {
}
public HDouble(double value) {
this.value = value;
}
@Override
public String toString() {
return String.valueOf(value);
}
}
我还测试了一些包含代码的循环。例如,我计算总和-> 相同的行为(差异不是很大,但我认为原始算法应该要快得多?)。一开始我以为计算会花费很长时间,这时访问字段几乎没有任何差别。
循环的封装:
for (i.value = 0; i.value <max.value; i.value++) {
sum.value = sum.value + i.value;
}
结果:
原始的for循环:MicroTime包装器(最大=10000.0):243
MicroTime包装器(最大=100000.0):2805
MicroTime包装器(最大=1000000.0):3409
MicroTime包装器(最大=1.0E7):28104
MicroTime包装器(最大=1.0E8):278432
MicroTime包装器(最大=1.0E9):2678322
MicroTime包装器(最大=1.0E10):26665540
for (i = 0; i < max; i++) {
sum = sum + i;
}
结果:
该文本展示了使用不同的最大值来测试MicroTime原始值的结果。MicroTime原始值(最大:=10000.0):149
MicroTime原始值(最大:=100000.0):1996
MicroTime原始值(最大:=1000000.0):2289
MicroTime原始值(最大:=1.0E7):27085
MicroTime原始值(最大:=1.0E8):279939
MicroTime原始值(最大:=1.0E9):2759133
MicroTime原始值(最大:=1.0E10):27369724
HDouble
的代码吗? - M A