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
[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”);
}
}
[/java]
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
[java]
public class concatenacion {
public concatenacion(){
}
public void MString(int n){
String temp = new String(”");
for(int k=0;k
temp+="1";
}
public void MStringBuffer(int n){
StringBuffer temp = new StringBuffer();
for(int k=0;k
temp.append("1");
}
}
[/java]
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
[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”);
}
}
[/java]
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
Recent Comments