sábado, junio 20, 2009

Rendimiento de bucles 'for' en Java 5

Hace ya algún tiempo leí un post sobre el rendimiento de los bucles 'for' en Javascript. El mencionado comentario defendía el rendimiento de los bucles decrementales sobre los incrementales alegando que en los primeros se compara la variable 'contador' con la constante 'cero' mientras en los incrementales se tiene que comparar en cada iteración con la variable que indica el número de iteraciones. Debido a que comparar con una constante es más rápido que con una variable los bucles decrementales son más rápidos.

Pues a mi se me ha ocurrido probar lo mismo en Java, en la máquina virtual que lleva Mac OS X (una JDK 5.0). Como podeis ver dentro del bucle lo único que hago es incrementar una variable (por hacer algo). Aquí teneis los resultados y el código utilizado:

Primero probé un bucle incremental; lo ejecuté tres veces saliendo un tiempo medio de 15.062 ms.
long loops = 2100000000;
long aux = 0;
long startTime = System.currentTimeMillis();
for (long cont=0; cont<=loops; cont++){
aux++;
}
long endTime = System.currentTimeMillis();
El bucle decremental también lo ejecuté varias veces consiguiendo un tiempo medio de 15.051 ms:
long loops = 2100000000;
long aux = 0;
long startTime = System.currentTimeMillis();
for(long cont=loops; cont>=0; cont--){
aux++;
}
long endTime = System.currentTimeMillis();
También se me ocurrió ver como se comporta el outboxing the Java 5.0. Le costó 15.063 ms.
Long loops = new Long(2100000000);
long aux = 0;
long startTime = System.currentTimeMillis();
for (long cont=0; cont<=loops; cont++){
aux++;
}
long endTime = System.currentTimeMillis();
Como podeis ver las diferencias son mínimas a pesar de los 2.100 millones de iteraciones. Sí que es cierto que el bucle decremental tiene un rendimiento mejor (10 ms) pero es claramente despreciable. En los cuatro años que llevo de vida profesional nunca he tenido un bucle tan grande como el que he usado para las pruebas y no se vosotros pero yo y la mayoría de la gente que conozco ven más "sencillos" los bucles incrementales. Es más fácil meter la pata con los < y <= en los decrementales y tener una iteración de más.
Otra cosa que sí que me ha sorprendido es el rendimiento del outboxing, es lo mismo usar long que Long supongo que esto es debido al compilador, es decir, que el bytecode acaba siendo el mismo.

No hay comentarios:

Publicar un comentario