次のコードで(私にとっては)奇妙なランタイム動作が発生します。
public class Main{
private final static long ROUNDS = 1000000;
private final static double INITIAL_NUMBER = 0.45781929d;
private final static double DIFFERENCE = 0.1250120303d;
public static void main(String[] args){
doSomething();
doSomething();
doSomething();
}
private static void doSomething(){
long begin, end;
double numberToConvert, difference;
numberToConvert = INITIAL_NUMBER;
difference = DIFFERENCE;
begin = System.currentTimeMillis();
for(long i=0; i<ROUNDS; i++){
String s = "" + numberToConvert;
if(i % 2 == 0){
numberToConvert += difference;
}
else{
numberToConvert -= difference;
}
}
end = System.currentTimeMillis();
System.out.println("String appending conversion took " + (end - begin) + "ms.");
}
}
プログラムが毎回同様のランタイムを出力することを期待しています。ただし、私が得る出力は常に次のようになります。
String appending conversion took 473ms.
String appending conversion took 362ms.
String appending conversion took 341ms.
最初の呼び出しは、その後の呼び出しよりも約 30% 遅くなります。ほとんどの場合、2 番目の呼び出しは 3 番目の呼び出しよりもわずかに遅くなります。
Java/javac バージョン:
javac 1.7.0_09 java version "1.7.0_09" OpenJDK Runtime Environment (IcedTea7 2.3.3) (7u9-2.3.3-0ubuntu1~12.04.1) OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)
だから、私の質問:なぜこれが起こるのですか?