El uso de cadenas, en un sistema es casi inevitable, pues las personas en general leen y escriben cadenas, independientemente de que estas representen fechas, numeros, palabras, etc.
La generacion de estas cadenas, repercute negativamente en el desempeño de una aplicacion o sistema, sobre todo, cuando se generan y utilizan de manera incorrecta o excesiva.
Un ejemplo es el operador + en el lenguaje de programacion, que cuando es correctamente empleado, puede no ser una carga excesiva, pero cuando se emplea incorrectamete o se mal interpreta su utilizacion, puede provocar que se trabaje de manera excesiva, consumiendo tiempo de procesamiento y memoria indiscriminadamente.
La mayoria de los lenguajes compilados, como Java, particularmente, los que no soportan sobrecarga de operadores por programacion, convierten las instrucciones que tienen el operador + cuando estan operando con cadenas, en objetos y/o funciones. Sin embargo, el compilador, puede tener la capacidad de manipular el codigo resultante, para minimizar el uso de los recursos (memoria y procesador)
En el siguiente codigo, se hace uso del operador +.
01: package test; 02: 03: public class StringTest { 04: public static void main(String[] args) { 05: String a = "cadena1"; 06: String b = "cadena2"; 07: String c = a + b; 08: System.out.println(c); 09: } 10: } 11:
Posteriormente ejecutamos los siguientes comandos:
javac test\StringBuilderTest.java
javap -c -classpath . test.StringTest
Obteniendo el siguiente codigo:
Compiled from "StringTest.java" public class test.StringTest extends java.lang.Object{ public test.StringTest(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16; //String cadena1 2: astore_1 3: ldc #18; //String cadena2 5: astore_2 6: new #20; //class java/lang/StringBuilder 9: dup 10: aload_1 11: invokestatic #22; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; 14: invokespecial #28; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V 17: aload_2 18: invokevirtual #31; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 21: invokevirtual #35; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 24: astore_3 25: getstatic #39; //Field java/lang/System.out:Ljava/io/PrintStream; 28: aload_3 29: invokevirtual #45; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 32: return }
Como se puede observar, el compilador, tradujo la sentencia con el operador + en el uso de la funcion valueOf, la creacion de un objeto StringBuilder, el uso de la funcion append y finalmente toString, es decir algo como esto:
01: package test; 02: 03: public class StringTest2 { 04: public static void main(String[] args) { 05: String a = "cadena1"; 06: String b = "cadena2"; 07: String c = new StringBuilder(String.valueOf(a)).append(b).toString(); 08: System.out.println(c); 09: } 10: } 11:
Nosotros conocemos que se estan empleando constantes, por lo que podemos substituir la variable por el valor.
1: package test; 2: 3: public class StringTest3 { 4: public static void main(String[] args) { 5: String c = "cadena1" + "cadena2"; 6: System.out.println(c); 7: } 8: } 9:
Ejecutamos la compilacion (javac) y de compilacion (javap), obteniendo lo siguiente:
Compiled from "StringTest3.java" public class test.StringTest3 extends java.lang.Object{ public test.StringTest3(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #16; //String cadena1cadena2 2: astore_1 3: getstatic #18; //Field java/lang/System.out:Ljava/io/PrintStream; 6: aload_1 7: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 10: return }
Este es el codigo equivalente, el cual genera el mismo codigo compilado, que el codigo anterior.
1: package test; 2: 3: public class StringTest4 { 4: public static void main(String[] args) { 5: String c = "cadena1cadena2"; 6: System.out.println(c); 7: } 8: } 9:
Como se puede notar, cuando se utilizan constantes, el operador + y el compilador, pueden optimizar el codigo, siempre y cuando la constante este "inline". De ahi, la frase inicial "mucho ayuda el que no estorba", en ocasiones hay que dejar que el compilador haga su trabajo.
No hay comentarios.:
Publicar un comentario