Java: String concat vs StringBuilder – optimizado, ¿qué debo hacer?

En esta respuesta , dice (implica) que la concatenación de cadenas se optimiza en las operaciones de StringBuilder de todos modos, así que cuando escribo mi código, ¿hay alguna razón para escribir el código de StringBuilder en la fuente? Tenga en cuenta que mi caso de uso es diferente de la pregunta del OP, ya que estoy concatenando / añadiendo cientos de miles de líneas.

Para ser más claro: soy muy consciente de las diferencias de cada uno, es solo que no sé si vale la pena escribir código StringBuilder porque es menos legible y cuando su primo supuestamente más lento, la clase String, se convierte automágicamente en el proceso de comstackción de todos modos.

Creo que el uso de StringBuilder vs + realmente depende del contexto en el que lo estás usando.

Generalmente, utilizando JDK 1.6 y versiones superiores, el comstackdor unirá cadenas automáticamente usando StringBuilder .

 String one = "abc"; String two = "xyz"; String three = one + two; 

Esto comstackrá String three como:

 String three = new StringBuilder().append(one).append(two).toString(); 

Esto es bastante útil y nos ahorra algo de tiempo de ejecución. Sin embargo, este proceso no siempre es óptimo. Toma por ejemplo:

 String out = ""; for( int i = 0; i < 10000 ; i++ ) { out = out + i; } return out; 

Si comstackmos para bytecode y luego descomstackmos el bytecode generado obtenemos algo como:

 String out = ""; for( int i = 0; i < 10000; i++ ) { out = new StringBuilder().append(out).append(i).toString(); } return out; 

El comstackdor ha optimizado el ciclo interno, pero ciertamente no ha realizado las mejores optimizaciones posibles. Para mejorar nuestro código, podríamos usar:

 StringBuilder out = new StringBuilder(); for( int i = 0 ; i < 10000; i++ ) { out.append(i); } return out.toString(); 

Ahora bien, esto es más óptimo que el código generado por el comstackdor, por lo que definitivamente es necesario escribir código utilizando las clases StringBuilder / StringBuffer en los casos en que se necesita un código eficiente. Los comstackdores actuales no son geniales para tratar cadenas de concatenación en bucles, sin embargo, esto podría cambiar en el futuro.

Debe mirar cuidadosamente para ver dónde necesita aplicar StringBuilder manualmente e intentar usarlo donde no reduzca la legibilidad de su código también.

Nota: compilé código usando JDK 1.6 y descompilé el código usando el progtwig javap , que escupe código de bytes. Es bastante fácil de interpretar y, a menudo, es una referencia útil a la vista cuando se trata de optimizar el código. El comstackdor cambia el código detrás de escena, por lo que siempre es interesante ver lo que hace.

La frase clave en su pregunta es “supuestamente más lenta”. Necesita identificar si esto es realmente un cuello de botella, y luego ver cuál es más rápido.

Si está a punto de escribir este código, pero aún no lo ha escrito, escriba lo que le resulte más claro y luego, si es necesario, vea si se trata de un cuello de botella.

Si bien tiene sentido utilizar el código que considera más fácil de usar, si ambos son igualmente legibles, en realidad tomarse el tiempo para descubrir cuál es más rápido cuando no lo necesita es una pérdida de tiempo. Legibilidad superior al rendimiento hasta que el rendimiento sea inaceptable.

Depende del caso, pero se cree que StringBuilder es un poco más rápido. Si está haciendo concatenación dentro de un bucle, le sugiero que use StringBuilder.

De todos modos, te aconsejaría que perfilaras y compararas tu código (si estás haciendo un anexión masivo).

Sin embargo, tenga cuidado: las instancias de StringBuilder son mutables y no deben compartirse entre hilos (a menos que realmente sepa lo que está haciendo) en lugar de String, que son inmutables.

Puede que haya entendido mal su pregunta, pero StringBuilder es más rápido al agregar Strings. Por lo tanto, sí, si agrega “cientos de miles de líneas”, definitivamente debería usar StringBuilder (o StringBuffer si está ejecutando una aplicación multiproceso).

(Una respuesta más completa en los comentarios)

    Intereting Posts