Como continuación del post anterior Curiosidades Java: Optimización de Strings (I), hoy os ofrezco una manera de optimizar de manera "brutal", si me permitís la expresión.
Normalmente, cuando uno empieza a programar en Java, solemos utilizar la clase String para representar cadenas de caracteres. En un principio, y para aplicaciones sencillas que no manejan una gran cantidad de cadenas, es suficiente. El problema viene cuando, por ejemplo, tenemos que realizar miles de concatenaciones de cadenas. En este caso la clase String presenta un rendimiento pésimo comparado con otras dos clases que vamos a tratar a continuación.
Clase StringBuilder
Esta clase es la que mayor rendimiento tiene a la hora de manejar cadenas. Pero también presenta un inconveniente: sólo se puede utilizar en una aplicación monohilo (si no sabes lo que significa seguramente no tendrás problemas).
Clase StringBuffer
La clase StringBuffer es exactamente igual que la clase StringBuilder, pero utiliza sincronización, lo que produce una disminución de rendimiento. Se debe usar en las aplicaciones multihilo, en vez de StringBuilder, y es mucho más rápida que la clase String.
Para ilustrar lo anteriormente expuesto podemos ejecutar el siguiente programa:
public class Optimizacion { public static final long REPETICIONES = 60000; public static void main(String[] args) { String s = ""; long tiempo = System.currentTimeMillis(); for (int i = 0; i < REPETICIONES; i++) { s += "a"; } tiempo = System.currentTimeMillis() - tiempo; System.out.println("String ha tardado: " + tiempo + " milisegundos"); StringBuffer s2 = new StringBuffer(); tiempo = System.currentTimeMillis(); for (int i = 0; i < REPETICIONES; i++) { s2.append("a"); } tiempo = System.currentTimeMillis() - tiempo; System.out.println("StringBuffer ha tardado: " + tiempo + " milisegundos"); StringBuilder s3 = new StringBuilder(); tiempo = System.currentTimeMillis(); for (int i = 0; i < REPETICIONES; i++) { s3.append("a"); } tiempo = System.currentTimeMillis() - tiempo; System.out.println("StringBuilder ha tardado: " + tiempo + " milisegundos"); } }
Me parece que tienes un fallo, el long debería ir en la primera linea que usas la variable tiempo:
String s = "";
long tiempo = System.currentTimeMillis();
for (int i = 0; i < REPETICIONES; i++) {
s += "a";
}
tiempo = System.currentTimeMillis() - tiempo;
System.out.println("String ha tardado: " + tiempo + " milisegundos");
StringBuffer s2 = new StringBuffer();
tiempo = System.currentTimeMillis();
Estimado Admin:
Tu artículo es excelente. Ahora... un modesto aporte para resolver un problema: en el programa, la variable "tiempo" debe estar definida antes de ser usada, o sino da error. Si no soy claro, hacémelo saber. Un abrazo y muchas gracias por tu artículo, ya que es esclarecedor. Carlos Desmaras.
Gracias a los dos. Lo corrijo ahora mismo.
Excelente y esclarecedor. Un abrazo desde Argentina.
Un ejemplo muy eficiente.
Muchas gracias por tu tiempo.
buen ejercicio, saludos