我用 java for 循环做了一些运行时测试,发现了一个奇怪的行为。对于我的代码,我需要原始类型(如 int、double 等)的包装器对象,以模拟 io 和输出参数,但这不是重点。只要看我的代码。具有字段访问权限的对象如何比原始类型更快?
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-compiler 和 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 循环:
for (i.value = 0; i.value <max.value; i.value++) {
sum.value = sum.value + i.value;
}
结果:
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 循环:
for (i = 0; i < max; i++) {
sum = sum + i;
}
结果:
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