A medida que la JVM se calienta, la cantidad de tiempo empleado puede variar. La segunda vez que ejecutas esto siempre será más rápido que el primero. (La primera vez que tiene que cargar clases y llamar a bloques estáticos) Después de haber ejecutado el método 10.000 veces será más rápido otra vez (El umbral predeterminado en el que compila el código en código de máquina nativo)
Para obtener un promedio reproducible el tiempo para un micro-punto de referencia, le sugiero que ignore las primeras 10.000 iteraciones y lo ejecute durante 2-10 segundos después de eso.
p. Ej.
long start = 0;
int runs = 10000; // enough to run for 2-10 seconds.
for(int i=-10000;i<runs;i++) {
if(i == 0) start = System.nanoTime();
// do test
}
long time = System.nanoTime() - start;
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs);
Muy importante: solo realice uno de estos ciclos por método. Esto se debe a que optimiza todo el método en función de cómo se usa. Si tiene un bucle ocupado como este, los bucles posteriores aparecerán más lentos porque no se han ejecutado y se optimizarán mal.
Sí, pero ninguna respuesta a su pregunta sobre cómo medir el "tiempo de CPU". –