Когда вы повторяете одну и ту же задачу много раз, ваш ЦП имеет тенденцию работать очень эффективно. Это связано с тем, что время простоя вашего кеша и прогрев процессора не учитываются. Также возможно, что вы не учитываете и теплое время JVM.
Если вы попытаетесь сделать то же самое, когда JVM и / или процессор не прогреются. Вы получите совсем другие результаты.
Попробуйте сделать то же самое, скажем 25 раз (меньше, чем ваш порог компиляции) и спать (100) между тестами. Вы должны ожидать увидеть намного более высокие времена, ближе к тому, что вы видите в реальном приложении.
Поведение вашего приложения будет отличаться, но чтобы проиллюстрировать мою точку зрения. Я обнаружил, что ожидание IO может быть более разрушительным, чем простой сон.
Когда вы выполняете тест, вы должны убедиться, что вы сравниваете подобное с подобным.
import java.io.*;
import java.util.Date;
/**
Cold JVM with a Hot CPU took 123 us average
Cold JVM with a Cold CPU took 403 us average
Cold JVM with a Hot CPU took 314 us average
Cold JVM with a Cold CPU took 510 us average
Cold JVM with a Hot CPU took 316 us average
Cold JVM with a Cold CPU took 514 us average
Cold JVM with a Hot CPU took 315 us average
Cold JVM with a Cold CPU took 545 us average
Cold JVM with a Hot CPU took 321 us average
Cold JVM with a Cold CPU took 542 us average
Hot JVM with a Hot CPU took 44 us average
Hot JVM with a Cold CPU took 111 us average
Hot JVM with a Hot CPU took 32 us average
Hot JVM with a Cold CPU took 96 us average
Hot JVM with a Hot CPU took 26 us average
Hot JVM with a Cold CPU took 80 us average
Hot JVM with a Hot CPU took 26 us average
Hot JVM with a Cold CPU took 90 us average
Hot JVM with a Hot CPU took 25 us average
Hot JVM with a Cold CPU took 98 us average
*/
public class HotColdBenchmark {
public static void main(String... args) {
// load all the classes.
performTest(null, 25, false);
for (int i = 0; i < 5; i++) {
// still pretty cold
performTest("Cold JVM with a Hot CPU", 25, false);
// still pretty cold
performTest("Cold JVM with a Cold CPU", 25, true);
}
// warmup the JVM
performTest(null, 10000, false);
for (int i = 0; i < 5; i++) {
// warmed up.
performTest("Hot JVM with a Hot CPU", 25, false);
// bit cold
performTest("Hot JVM with a Cold CPU", 25, true);
}
}
public static long performTest(String report, int n, boolean sleep) {
long time = 0;
long ret = 0;
for (int i = 0; i < n; i++) {
long start = System.nanoTime();
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(new Date());
oos.close();
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
Date d = (Date) ois.readObject();
ret += d.getTime();
time += System.nanoTime() - start;
if (sleep) Thread.sleep(100);
} catch (Exception e) {
throw new AssertionError(e);
}
}
if (report != null) {
System.out.printf("%s took %,d us average%n", report, time / n / 1000);
}
return ret;
}
}