在尝试比较数据类型'int'和'long'的性能时,我遇到了这个奇怪的问题,基本上我有两个单元测试:
@Test
public void testLongOperationPerformance(){
StopWatch sw = new StopWatch();
sw.start();
long count = 0l;
for(int i = 0; i < Integer.MAX_VALUE; i ++){
count++;
}
sw.stop();
System.out.println(count);
System.out.println(sw.elaspedTimeInMilliSeconds());
}
@Test
public void testIntegerOperationPerformance(){
StopWatch sw = new StopWatch();
sw.start();
int count = 0;
for(int i = 0; i < Integer.MAX_VALUE; i ++){
count++;
}
sw.stop();
System.out.println(count);
System.out.println(sw.elaspedTimeInMilliSeconds());
}
这两个单元测试正在做同样的事情,不同的是一个使用int作为计数器的数据类型,另一个使用long。 结果:
jdk6u32 (64 bit):
test with long
2147483635
96
test with int
2147483647
2
jdk7 (64 bit)
test with long
2147483647
1599
test with int
2147483647
1632
我注意到了:
任何人都可以解释为什么会这样吗?
答案 0 :(得分:6)
Java JIT特别擅长消除无法执行任何操作的代码。在您的示例中,循环
long count = 0l;
for(int i = 0; i < Integer.MAX_VALUE; i ++){
count++;
}
可以替换为
long count = 0l;
count += Integer.MAX_VALUE * 1;
您的时间是检测和移除循环所需的时间。这个时间可以取决于它之前做了什么,所以我建议以不同的顺序测试循环,看看是否会改变结果。
在Java 6&amp; 7,许多循环优化被错误地优化。
e.g。对于某些更新,这种无限循环并不总是无限的
for(int i=0; i < Integer.MAX_VALUE; i += 2)
出于这个原因,某些更新具有不同的优化开启或关闭,具体取决于它们是否适用于该版本。我建议尝试使用最新版本的Java 7,看看它是否有所作为。