【发布时间】:2012-08-24 17:48:11
【问题描述】:
我在尝试比较数据类型“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 作为 counter 的数据类型,另一个使用 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
我注意到了:
- 在 jdk6u32 中,使用 int 进行测试比使用 long 进行测试要快得多
- 在 jdk6u32 中,int 测试和 long 测试的测试结果不同
- 在 jdk7 中,两个测试的速度差不多,但都比 jdk6u32 慢得多
- 在 jdk7 中,两个测试得到了相同的结果
谁能解释一下为什么会这样?
【问题讨论】:
-
你是说 jdk6u32 返回错误的数字(缺少 12 次迭代)?
-
你确定你发布的代码和结果吗:使用 JDK 的长测试正在消耗循环的一部分似乎很奇怪。
-
您还应该选择不那么琐碎的测试。编译器或 JIT 可以优化您的代码并轻松地立即删除循环,因为最后的计数值可以很容易地计算出来。
标签: java performance long-integer java-7 jdk6