2012-10-03 44 views
10

¿Qué harías?Optimización de Java: variable local o llamada de función

doThings(folder.getInstructions()) ; 
for (Instruction instruction : folder.getInstructions()) { 
    // do things 
} 
functionCall(folder.getInstructions()) ; 

O esto:

instructions = folder.getInstructions() ; 
doThings(instructions) 
for (Instruction instruction : instructions) { 
    // do things 
} 
functionCall(instructions) ; 

Por encima de todo, me gustaría saber cuando es más eficiente para almacenar un valor en una variable local, y cuando es mejor hacer llamadas a funciones.

Respuesta

20

Más legible es más eficiente. Las expresiones temporales y las variables locales necesitan el mismo espacio y desde la perspectiva de CPU/JVM no hace mucha diferencia. JVM hará un mejor trabajo optimizando/inlingándolo.

Sin embargo, si getInstructions() llamada al método es caro, caché en la variable local. Si se trata de un getter sencillo, de todos modos estará engarzado. También en mi humilde opinión, la variable local es más legible y tal vez incluso más correcta si getInstructions() puede tener resultados diferentes a lo largo del tiempo.

0

Siempre que desee utilizar el resultado de un método más de una vez, es mejor almacenar el resultado de la invocación de método en alguna variable temporal. Esto ahorra tiempo de proceso de invocación de método. Esto no afectará tanto en este caso .. Pero puede afectar cuando hay muchas invocación ..

Además, recuerde, sus variables locales se almacenan en stack. Entonces, tener una variable local temporal es ocupar espacio en la pila. Aunque esto no es una gran preocupación en pequeños casos como éste .. Pero innecesarios variables locales, debe evitarse ..

Por lo tanto, hay pros y contras de ambos métodos ..

10

Eso depende completamente de lo que haga getInstructions(). Si solo devuelve el valor de un campo - y si está seguro de que el valor del campo no cambiará entre llamadas - entonces probablemente no verá ninguna diferencia de eficiencia entre los dos fragmentos.

Si, por otro lado, getInstructions() necesita hacer una docena de solicitudes web, entonces claramente desea evitar llamar así varias veces.

La legibilidad es más importante que la eficiencia. En este caso, encuentro que la segunda opción es más legible de todos modos, es más claro que desea tomar tres pasos separados (dos llamadas a método y un bucle) con el mismo valor. Por otro lado, estoy muy feliz de escribir algo como:

for (int i = 0; i < text.length(); i++) { 
    ... 
} 

en lugar de romper que a cabo en una variable independiente:

int length; 
for (int i = 0; i < length; i++) { 
    ... 
} 

Realmente depende del contexto. A veces, una variable adicional ayuda, a veces no lo hace, desde una perspectiva de legibilidad. La perspectiva de efficiency depende completamente de lo que haga la llamada de método, y de si es "inlinable" para el JIT.

0

Mi respuesta depende de qué tipo de aplicación que estoy tratando de desarrollar.Por ejemplo,

El primer bloque de código es mejor si los valores cambian rápidamente durante la aplicación. Esto es bueno si necesita resultados precisos.

El segundo uno es bueno si está seguro de que los valores inicialmente obtenidos no afectarán a las otras partes del código.

0

Creo que depende de la situación. si requiere hacer el mismo método, llame muchas veces (y obtendrá el mismo valor) y mejor haga una llamada y guárdela en alguna variable local.

y si necesita llamar a la función una sola vez. no es necesario buscar variables locales

Cuestiones relacionadas