Me han dicho en la escuela que es una mala práctica de modificar la variable de índice de un for loop
:opción de JVM para optimizar sentencias de bucle
Ejemplo:
for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}
El argumento era que algún compilador la optimización puede optimizar el bucle y no recalcular el índice y el límite en cada bucle.
He hecho algunas pruebas en java
y parece que por defecto el índice y el límite se recalculan cada vez.
Me pregunto si es posible activar este tipo de función en el JVM HotSpot
?
Por ejemplo, para optimizar este tipo de bucle:
for(int i = 0 ; i < foo.getLength() ; i++){ }
sin tener que escribir:
int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }
Es sólo un ejemplo Tengo curiosidad por probar y ver los alguna mejora.
EDITAR
Según Peter Lawrey responder por ello que en este sencillo ejemplo, la JVM no lo hacen en línea getLenght()
método?:
public static void main(String[] args) {
Too t = new Too();
for(int j=0; j<t.getLength();j++){
}
}
class Too {
int l = 10;
public Too() {
}
public int getLength(){
//System.out.println("test");
return l;
}
}
En la "prueba" de salida de impresión es de 10 veces.
Creo que podría ser bueno optimizar este tipo de ejecución.
EDIT 2: Parece que hice un mal entendido ...
tengo retirar el println
y de hecho el perfilador dime que el método getLength()
ni siquiera se llama una vez en este caso.
Parece que no entienden * lo que * en línea hace. El 101 de cada optimización del compilador es que el código producido puede ser funcionalmente equivalente al comportamiento que demanda el JLS. Esto significa que podemos alinear una llamada de función, pero NO PODEMOS eliminar una llamada 'println()'. Además, realmente no debería preocuparse por tales optimizaciones del compilador, o si lo hace, debe comprender al menos lo suficiente como para saber cómo probar este tipo de código. – Voo
Ok, yo no sabía eso, soy bastante nuevo y todavía estoy aprendiendo mucho. Este tipo de "avance"? los conocimientos permanecen desapercibidos en (mi) escuela, por lo que trato de entender por mí mismo y a menudo cometo errores: s –
Era tan libre y de hecho miré el código en detalle, para responder a su pregunta en breve: El JIT en línea 'getLength() 'bien, independientemente de si tiene la instrucción println() allí o no. Si desea los detalles que publicó un breve resumen a continuación;) – Voo