Estoy jugando con un poco de código calculando el tiempo necesario para calcular algunos códigos Java para tener una idea de la eficiencia o ineficiencia de algunas de las funcionalidades de Java. Al hacerlo, ahora estoy atascado con un efecto realmente extraño. Simplemente no puedo explicarlo. Tal vez alguien de ustedes me puede ayudar a entenderlo.Java efficiency
public class PerformanceCheck {
public static void main(String[] args) {
List<PerformanceCheck> removeList = new LinkedList<PerformanceCheck>();
int maxTimes = 1000000000;
for (int i=0;i<10;i++) {
long time = System.currentTimeMillis();
for (int times=0;times<maxTimes;times++) {
// PERFORMANCE CHECK BLOCK START
if (removeList.size() > 0) {
testFunc(3);
}
// PERFORMANCE CHECK BLOCK END
}
long timeNow = System.currentTimeMillis();
System.out.println("time: " + (timeNow - time));
}
}
private static boolean testFunc(int test) {
return 5 > test;
}
}
A partir de este se traduce en un tiempo de cálculo relativamente largo (recuerda removeList está vacía, por lo TestFunc ni siquiera se llama):
time: 2328
time: 2223
...
Al reemplazar algo de la combinación de removeList.size()> 0 y testFunc (3) con cualquier otra cosa tiene mejores resultados. Por ejemplo:
...
if (removeList.size() == 0) {
testFunc(3);
}
...
Resultados en (TestFunc se llama cada vez):
time: 8
time: 7
time: 0
time: 0
Incluso llamando a ambas funciones independientes unos de otros resultados en el tiempo de cálculo más baja:
...
if (removeList.size() == 0);
testFunc(3);
...
resultado:
time: 6
time: 5
time: 0
time: 0
...
Solo esta combinación particular en mi ejemplo inicial toma tanto tiempo. Esto me irrita y realmente me gustaría entenderlo. ¿Qué tiene de especial?
Gracias.
Adición:
Cambio TestFunc() en el primer ejemplo
if (removeList.size() > 0) {
testFunc(times);
}
a otra cosa, como
private static int testFunc2(int test) {
return 5*test;
}
Va resultar en ser rápido otra vez.
Y ejecutó esta prueba más de una vez, y en diferentes pedidos ¿no? El orden no debería importar, pero solo para estar seguro. Además, ¿obtiene (aproximadamente) los mismos resultados con nanoTime como se sugiere a continuación? – prelic
Este tipo de micro-benchmark es una muy mala idea. También tenga en cuenta que el JIT puede tomar varias decisiones en momentos arbitrarios y optimizar su código completamente, si se da cuenta de que realmente no está sucediendo nada. –
Debe usar [System.nanoTime()] (http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime%28%29) para medir la ejecución del código en Java . Es más preciso más discusión [en esta pregunta] (http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime) – paislee