Comments on: StringBuffer mejor que usar + …. cuidado!!!! http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/ La Cara Oscura del Desarrollo de Software Tue, 09 Sep 2008 23:47:03 +0000 http://wordpress.org/?v=2.6.1 By: MadeInMiPueblo http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-814 MadeInMiPueblo Fri, 31 Aug 2007 10:07:41 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-814 Y yo que ponía especial cuidado en usar StringBuffer... gracias por el post. Y yo que ponía especial cuidado en usar StringBuffer… gracias por el post.

]]>
By: cesar http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-796 cesar Thu, 02 Aug 2007 22:28:49 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-796 buenas buenas

]]>
By: chily http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-772 chily Thu, 21 Jun 2007 01:28:09 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-772 Totalmente de acuerdo, la concatenacion de string hoy por hoy no tiene influencia en los tiempos de ejecucion. el foco deberia estar puesto en lo mantenible que es el codigo generado. http://gpitech.wordpress.com/ Totalmente de acuerdo, la concatenacion de string hoy por hoy no tiene influencia en los tiempos de ejecucion. el foco deberia estar puesto en lo mantenible que es el codigo generado.
http://gpitech.wordpress.com/

]]>
By: walter bento http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-525 walter bento Mon, 13 Nov 2006 21:24:30 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-525 Estou procurando um decompilador para sql server. o programador sumiu e eu preciso fazer uns ajustes num sistema de patrimônio. se puderes me ajudar ficareio eternamente grato. atenciosamente, Walter bento de Lima .´. Estou procurando um decompilador para sql server. o programador sumiu e eu preciso fazer uns ajustes num sistema de patrimônio. se puderes me ajudar ficareio eternamente grato. atenciosamente,

Walter bento de Lima .´.

]]>
By: SCAN http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-508 SCAN Wed, 25 Oct 2006 17:24:19 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-508 me podrias echar una alluda hice este codigo para leer archivos pero es muy lento para archivos muy grandes estuve leyendo y me encontre con un StringBuffer con esto segun lo leiria mas rapido pero no se como implementarlo me podrian decir como quedaria el codigo gracias...porfavor alludenme import java.io.RandomAccessFile; import java.io.FileNotFoundException; import java.io.IOException; public class Visor{ private String archivo; public Visor (String archivo){ this.archivo=archivo; } public String leer(){ RandomAccessFile raf; String texto=""; try{ String linea = null; raf = new RandomAccessFile(this.archivo, "r"); while((linea=raf.readLine())!=null){ texto=texto+linea+"\n";//concatenacion } raf.close(); } catch(FileNotFoundException fnfe){ System.out.println("Archivo no econtrado"); } catch(IOException ioe){ System.out.println("Error de I/O."); } return texto; } } me podrias echar una alluda hice este codigo para leer archivos pero es muy lento para archivos muy grandes estuve leyendo y me encontre con un StringBuffer con esto segun lo leiria mas rapido pero no se como implementarlo me podrian decir como quedaria el codigo gracias…porfavor alludenme

import java.io.RandomAccessFile;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Visor{
private String archivo;
public Visor (String archivo){
this.archivo=archivo;
}

public String leer(){

RandomAccessFile raf;
String texto=”";
try{
String linea = null;
raf = new RandomAccessFile(this.archivo, “r”);
while((linea=raf.readLine())!=null){
texto=texto+linea+”\n”;//concatenacion
}

raf.close();
}
catch(FileNotFoundException fnfe){
System.out.println(”Archivo no econtrado”);

}
catch(IOException ioe){
System.out.println(”Error de I/O.”);
}

return texto;

}

}

]]>
By: Edgar González http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-419 Edgar González Mon, 14 Aug 2006 13:31:40 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-419 Efectivamente si la idea es concatenar literales y el issues es el performance, el + puede se mejor opción que el uso de StringBuffer, inclusive yo agregaría que la variable en cuestion fuese estática: [java] static String resultado = "11111" + "22222" + "33333"; [/java] Por otro lado el uso de StringBuffer se justifica más si cuando usamos el constructor le pasamos la longitud inicial del buffer, para que la "allocación" de memoria sea eficiente. [java] StringBuffer sb = new StringBuffer(100); [/java] Efectivamente si la idea es concatenar literales y el issues es el performance, el + puede se mejor opción que el uso de StringBuffer, inclusive yo agregaría que la variable en cuestion fuese estática:

JAVA:
  1. static String resultado = "11111""22222" + "33333";

Por otro lado el uso de StringBuffer se justifica más si cuando usamos el constructor le pasamos la longitud inicial del buffer, para que la "allocación" de memoria sea eficiente.

JAVA:
  1. StringBuffer sb = new StringBuffer(100);

]]>
By: robmv http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-407 robmv Thu, 10 Aug 2006 22:31:53 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-407 Para ver si me ayudo a explicar un poco más... sin pensar mucho en el orden de magnitud ni la concurrencia, que se ejecuta más rápido: int numero = 1 + 5 * 8 * 2 * 129381923; o int numero = 10350553841; la respuesta es sencilla.. tardan exactamente lo mismo, ya que los compiladores Java no generan las intrucciones para calcular "1 + 5 * 8 * 2 * 129381923" sino que lo calculan antes de generar el bytecode. Igual pasa con el caso analizado, tres literales preconcatenados por el compilador Para ver si me ayudo a explicar un poco más... sin pensar mucho en el orden de magnitud ni la concurrencia, que se ejecuta más rápido:

int numero = 1 + 5 * 8 * 2 * 129381923;

o

int numero = 10350553841;

la respuesta es sencilla.. tardan exactamente lo mismo, ya que los compiladores Java no generan las intrucciones para calcular "1 + 5 * 8 * 2 * 129381923" sino que lo calculan antes de generar el bytecode. Igual pasa con el caso analizado, tres literales preconcatenados por el compilador

]]>
By: robmv http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-406 robmv Thu, 10 Aug 2006 21:51:34 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-406 jejeje no estoy generalizando, el caso es muy especifico, son 3 literales... no hay nada dinamico alli.. siempre va a ser los mismos tres literales, no importa cuanta gente llame a ese método. Pero personalmente estoy 100% seguro que en este caso bien concreto, prefiero que mis colegas en el desarrollo usen + ya que si el método es de alto uso, digamos 100 request por segundo.. prefiero usar un solo literal unido por el compilador que 100 instancias creadas de StringBuffer con 4 invocaciones de métodos... OJO.. son literales no estoy hablando de armar un WHERE dinamicamente ni nada por el estilo :-P... alguien que opine para que nos quitemos los guantes .. jajajajaja jejeje no estoy generalizando, el caso es muy especifico, son 3 literales... no hay nada dinamico alli.. siempre va a ser los mismos tres literales, no importa cuanta gente llame a ese método. Pero personalmente estoy 100% seguro que en este caso bien concreto, prefiero que mis colegas en el desarrollo usen + ya que si el método es de alto uso, digamos 100 request por segundo.. prefiero usar un solo literal unido por el compilador que 100 instancias creadas de StringBuffer con 4 invocaciones de métodos... OJO.. son literales no estoy hablando de armar un WHERE dinamicamente ni nada por el estilo :-P... alguien que opine para que nos quitemos los guantes .. jajajajaja

]]>
By: KodeGeeK http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-405 KodeGeeK Thu, 10 Aug 2006 20:55:28 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-405 Hola Robmv, Sobre esto: "1- Buscar la clase java.lang.StringBuffer 2- Invocar al contructor al instanciar el objecto 5- Asignar el valor a la variable resultado" Para 1: El costo es negligible de nuevo, ya que una vez cargada la clase StringBuffer no hace falta hacerlo mas (asi que es un costo de una sola vez) Para 2: La instancia del objeto StringBuffer dependiendo de la aplicacion en pocas palabras se puede recliclar (StringBuffer.setLength(0)). Si es un metodo largo o la aplicacion no requiere concurrencia, entonces quizas un Singleton resuelve el problema. Para 5: Es una asignacion de una referencia, eso toma el mismo tiempo (no estas llamando a ningun constructor, no es asi?) Como puedes ver eso de la velocidad depende mucho de la aplicacion, asi que no deberias ser tan rapido al generalizar :) Saludos. Hola Robmv,

Sobre esto:
"1- Buscar la clase java.lang.StringBuffer
2- Invocar al contructor al instanciar el objecto
5- Asignar el valor a la variable resultado"

Para 1: El costo es negligible de nuevo, ya que una vez cargada la clase StringBuffer no hace falta hacerlo mas (asi que es un costo de una sola vez)
Para 2: La instancia del objeto StringBuffer dependiendo de la aplicacion en pocas palabras se puede recliclar (StringBuffer.setLength(0)). Si es un metodo largo o la aplicacion no requiere concurrencia, entonces quizas un Singleton resuelve el problema.
Para 5: Es una asignacion de una referencia, eso toma el mismo tiempo (no estas llamando a ningun constructor, no es asi?)

Como puedes ver eso de la velocidad depende mucho de la aplicacion, asi que no deberias ser tan rapido al generalizar :)

Saludos.

]]>
By: robmv http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-404 robmv Thu, 10 Aug 2006 17:57:13 +0000 http://www.lacaraoscura.com/2006/08/09/stringbuffer-mejor-que-usar-cuidado/#comment-404 Hola KodeGeek, la idea era mostrar ese ejemplo exactamente , ¿por qué? porque el SQL formado por tres literales exactamente (literales = que son explicitamente indicados en el código), por lo que es falso lo que dices de que es ineligible en este caso usar un StringBuffer o +... Aclaro un poco, si usara un String buffer el JVM tendría que hacer lo siguiente: 1- Buscar la clase java.lang.StringBuffer 2- Invocar al contructor al instanciar el objecto 3- Invocar 3 veces al método append() 4- Invocar al método toString() 5- Asignar el valor a la variable resultado en el caso de usar el operador + haria lo siguiente 1- Buscar el String "SELECT COL_A, COL_B, COL_C, COL_D, COL_E FROM TABLA_A WHERE COL_A > ?" en la definición de la clase (recuerda que el compilador lo concatenó y lo puso como un solo literal en el .class) 2- Asignar el valor a la variable resultado El separar los SQLs en multiples lineas se hace con frecuencia solo por ayudar en la lectura del SQL ya que es mas facil leer String sql = "SELECT COL_A, COL_B, COL_C, COL_D, COL_E" + " FROM TABLA_A" + " WHERE COL_A> ?"; que todo en una sola línea. Nunca mi intención fue decir nunca se debe usar el StringBuffer.... solo es un "CUIDADO" bien notorio a los errores que he visto con frecuencia, como este, concatenar puros literales con StringBuffer. te remito a loque escribí al final: "OJO esto no significa que ahora van a ser super confiados con el +, principalmente cuando se está construyendo un String muy grande y hay ciclos en medio de todo." Hola KodeGeek, la idea era mostrar ese ejemplo exactamente , ¿por qué? porque el SQL formado por tres literales exactamente (literales = que son explicitamente indicados en el código), por lo que es falso lo que dices de que es ineligible en este caso usar un StringBuffer o +... Aclaro un poco, si usara un String buffer el JVM tendría que hacer lo siguiente:

1- Buscar la clase java.lang.StringBuffer
2- Invocar al contructor al instanciar el objecto
3- Invocar 3 veces al método append()
4- Invocar al método toString()
5- Asignar el valor a la variable resultado

en el caso de usar el operador + haria lo siguiente

1- Buscar el String "SELECT COL_A, COL_B, COL_C, COL_D, COL_E FROM TABLA_A WHERE COL_A > ?" en la definición de la clase (recuerda que el compilador lo concatenó y lo puso como un solo literal en el .class)
2- Asignar el valor a la variable resultado

El separar los SQLs en multiples lineas se hace con frecuencia solo por ayudar en la lectura del SQL ya que es mas facil leer

String sql = "SELECT COL_A, COL_B, COL_C, COL_D, COL_E" +
" FROM TABLA_A" +
" WHERE COL_A> ?";

que todo en una sola línea. Nunca mi intención fue decir nunca se debe usar el StringBuffer.... solo es un "CUIDADO" bien notorio a los errores que he visto con frecuencia, como este, concatenar puros literales con StringBuffer. te remito a loque escribí al final:

"OJO esto no significa que ahora van a ser super confiados con el +, principalmente cuando se está construyendo un String muy grande y hay ciclos en medio de todo."

]]>