Sólo echar un vistazo en el código de bytes con javap -c [ClassName]
. Aquí hay una clase que muestra algunos ejemplos de variables de uso único con bucles. El volcado de código de bytes es relevante en los comentarios:
class HelloWorldLoopsAnnotated {
//
// HelloWorldLoopsAnnotated();
// Code:
// 0: aload_0
// 1: invokespecial #1; //Method java/lang/Object."<init>":()V
// 4: return
////////////////////////////////////////////////////////////////////////////
void stringDeclaredInsideLoop(){
while (true) {
// 0: ldC#2; //String Hello World!
String greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredInsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringDeclaredOutsideLoop(){
String greeting;
while (true) {
greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredOutsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringAsDirectArgument(){
while (true) {
doNothing("Hello World!");
}
}
// void stringAsDirectArgument();
// Code:
// 0: aload_0
// 1: ldC#2; //String Hello World!
// 3: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 6: goto 0
////////////////////////////////////////////////////////////////////////////
private void doNothing(String s) {
}
}
stringDeclaredInsideLoop()
y stringDeclaredOutsideLoop()
rendimiento idéntico código de bytes de seis instrucción. stringDeclaredInsideLoop()
todavía gana: alcance limitado es el mejor.
Después de un poco de contemplación, realmente no puedo ver cómo el alcance de ajuste podría afectar el rendimiento: datos idénticos en la pila necesitarían instrucciones idénticas.
stringAsDirectArgument()
, sin embargo, define la operación en solo cuatro instrucciones. Los entornos con poca memoria (por ejemplo, mi teléfono magníficamente tonto) pueden apreciar la optimización, mientras que un colega que lee su código puede no hacerlo, así que tenga sentido antes de afeitar los bytes de su código.
Consulte el full gist para más.
Esta respuesta es engañosa, ya que implica que la variable de referencia se asigna una vez por cada iteración, que es * no * verdadera. –
@BlueRaja - Danny Pflughoeft: Como dije en mi respuesta, simplemente está creando una * referencia * a un objeto, no asignando todo el objeto en sí. Es por eso que la cantidad de memoria es muy pequeña, porque solo los pocos bytes necesarios para la referencia es todo lo que está involucrado. – MAK
Sí, entiendo; pero incluso esa referencia (el puntero en sí) solo se asigna una vez, lo que es contrario a lo que la frase * "asignar/desasignar no debería afectar su programa significativamente" * implica. –