奇妙な結果に出くわしたとき、私はオブジェクトの割り当てに関していくつかのパフォーマンステストを行っていました。私は次のJavaコードを持っています:
public static long TestMethod(){
int len = 10000000;
Object[] obs = new Object[len];
long t = System.nanoTime();
for (int i = 0; i < len; i++) {
obs[i] = new Object();
}
return System.nanoTime() - t;
}
public static void main(String... args) throws InterruptedException {
for(int i = 0; i < 10; i++){
System.gc();
System.gc();//Wait for the gc to be finished
Thread.sleep(1000);
System.out.println(TestMethod());
}
}
期待:オペレーティングシステムとホットスポットの拡張機能からより大きなメモリスペースを要求するため、最初の呼び出しは2番目の呼び出しよりも遅くなります。しかし、2番目と3番目はほぼ同じになります。
観測結果:
11284734000
799837000
682304000
304736000
380770000
392786000
374279000
381611000
379174000
407256000
それでも、3回目と4回目の反復の間でかなりのスピードアップがあります。このスピードアップの原因は何ですか?他の関数をテストするときに測定値が正確であることを確認するにはどうすればよいですか?測定する前に関数を4回以上呼び出す必要がありますか?