Muchas veces al programar considero muchas cuestiones, como lo es la rapidez, la eficacia del código, y la estabilidad.
En una de esas veces, al intentar programar la lectura de un archivo de texto con java, utilice la clase String para almacenar los caracteres al estilo cadena+=nuevacadena. El archivo era muy pequeño, por lo que la lectura del mismo se hacia a una velocidad considerable, así que incremente la cantidad de información para ver que tan rápido podía concatenar las cadenas.
Mi sorpresa fue grande, pues a considerar que la primer prueba con el archivo pequeño fue tan rápida que no imagine que al incrementar la información la operación pudiera complicarse y hacerse mas tardía.
Intente hacer otra cosa, sin embargo, opte por otra opción que es utilizar StringBuffer, así que hice pruebas para comparar velocidades entre String y StringBuffer.
Para ello, primero diseñe un programa que midiera el tiempo de ejecución, así que debía medir el tiempo antes de iniciar la operación y una vez terminada medirlo de nuevo en una nueva variable para después restarle el primer tiempo medido.
El código de medición quedará así.
main.java
-
public class main {
-
-
public static void main
(String args
[]){
-
double tini =
System.
currentTimeMillis();
-
-
//operaciones o procesos
-
-
double ttotal =
System.
currentTimeMillis() - tini;
-
System.
out.
println("Tiempo de ejecución: " + ttotal/
1000 +
" seg");
-
}
-
}
En la linea donde esta el comentario "//operaciones o procesos" vamos a poner el proceso que queremos medir, así que me propuse a hacer otra clase que contuviera dos métodos, uno llamado MString(int n) para la clase String y otro llamado MStringBuffer(int n) para la clase StringBuffer. Ambos reciben un valor para n del tipo entero que contendrá el numero e concatenaciones que queremos hacer.
concatenacion.java
-
public class concatenacion {
-
-
public concatenacion(){
-
-
}
-
-
public void MString(int n){
-
-
for(int k=0;k<n;k++)
-
temp+="1";
-
}
-
public void MStringBuffer(int n){
-
-
for(int k=0;k<n;k++)
-
temp.append("1");
-
}
-
}
Ambos métodos MString y MStringBuffer son parecidos, ambos con un for de 0 a n, pero podemos darnos cuenta que la concatenación de String la realizamos de la forma temp+="1" y la de StringBuffer de la forma temp.append("1");
La clase main la modifique de esta manera para que me diera el tiempo para ambos procesos.
main.java
-
public class main {
-
-
public static void main
(String args
[]){
-
double tini;
-
double ttotal;
-
concatenacion temp;
-
int n=100;
-
-
tini =
System.
currentTimeMillis();
-
-
temp = new concatenacion();
-
temp.MString(n);
-
-
ttotal =
System.
currentTimeMillis() - tini;
-
System.
out.
println("Tiempo de ejecución para String: " + ttotal/
1000 +
" seg");
-
-
tini =
System.
currentTimeMillis();
-
-
temp = new concatenacion();
-
temp.MStringBuffer(n);
-
-
ttotal =
System.
currentTimeMillis() - tini;
-
System.
out.
println("Tiempo de ejecución para StringBuffer: " + ttotal/
1000 +
" seg");
-
}
-
}
Donde n tendrá el numero de concatenaciones que haremos de "1", y en primera instancia le puse el valor de 100 para ver al diferencia.
Pruebas
Al correr main.java con n=100
Tiempo de ejecución para String: 0.0010 seg
Tiempo de ejecución para MString: 0.0 seg
Aquí la diferencia es mínima, nada notable, ahora hagamos una prueba mas.
Al correr main.java con n=10000
Tiempo de ejecución para String: 0.299 seg
Tiempo de ejecución para MString: 0.0020 seg
Aquí ya podemos ver una diferencia mas notable, pero que tal con la siguiente prueba.
Al correr main.java con n=100000
Tiempo de ejecución para String: 42.117 seg
Tiempo de ejecución para StringBuffer: 0.01 seg
Claramente vemos la diferencia de los tiempos.
Conclusión: para este tipo de cuestiones de concatenación de información (cadenas) muy grande, es preferible usar StringBuffer.
by: lesthack