データ型「int」と「long」のパフォーマンスを比較しようとすると、この奇妙な問題が発生します。基本的に、2 つの単体テストがあります。
@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());
}
これら 2 つの単体テストは同じことを行っています。違いは、一方はカウンターのデータ型として 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
私は気づきました:
- jdk6u32 では、int を使用したテストは long を使用したテストよりもはるかに高速です
- jdk6u32で、intを使ったテストとlongを使ったテストでテスト結果が違う
- jdk7 では、両方のテストの速度はほぼ同じですが、どちらも jdk6u32 よりもはるかに遅いです。
- jdk7では、両方のテストで同じ結果が得られました
なぜそうなのか、誰か説明できますか?