¿El uso de una lista de caracteres es más rápido para realizar la concatenación de múltiples cadenas?
-
20-09-2019 - |
Pregunta
Estoy usando el micro framework .Net, por lo que StringBuilder no está disponible.
He visto código de profesionales aptos para usar una Arraylist de caracteres para concatenar y construir cadenas, a diferencia del operador +.Básicamente, construyen un StringBuilder de código administrado.
¿Hay alguna ventaja de rendimiento en esto?Supongamos que el número de concatenaciones es superior a 10 y que las longitudes de las cadenas también son superiores a 10.
Solución
No, no uses un ArrayList
de char
valores.Eso encuadrará cada carácter: el rendimiento será horrible, al igual que el uso de la memoria.(Tamaño de una referencia + tamaño de un carácter encuadrado para cada carácter...¡Ay!)
Usar una char[]
internamente y "cambiar su tamaño" (crear una nueva matriz y copiar el contenido) cuando sea necesario, tal vez duplicando su tamaño cada vez.(EDITAR:No cambia su tamaño al tamaño exacto que necesita; comenzaría con, digamos, 16 caracteres y seguiría duplicándolos, por lo que la mayoría Append
operaciones no necesita "cambiar el tamaño" de la matriz.)
Eso es similar a como StringBuilder
funciona de todos modos.(Está aún más cerca de cómo funciona Java StringBuilder
obras.)
Te sugiero que construyas el tuyo propio. StringBuilder
tipo con los miembros más importantes.Pruebe la unidad a fondo y perfile cuando corresponda.
Déjame saber si quieres un breve ejemplo.
Otros consejos
La única razón por la que el uso de un ArrayList de caracteres para construir una cadena sería considerado performant es si se compara con algo que tiene muy mal rendimiento. Concatenar una cadena enorme usando + = sería un ejemplo de algo que tendría tan mal rendimiento.
Puede hacer que la concatenación de cadenas mucho más eficiente si sólo concatenar en varias cadenas más cortas en lugar de una cadena grande.
Este código, por ejemplo:
string[] parts = new string[1000];
for (int i = 0; i < parts.Length; i++) {
string part = String.Empty;
for (int j=0; j < 100; j++) {
part += "*";
}
parts[i] = part;
}
string result = String.Concat(parts);
es de alrededor de 450 veces más rápido que este código:
string result = string.Empty;
for (int i = 0; i < 100000; i++) {
result += "*";
}
A StringBuilder es todavía más rápido, pero es sólo alrededor de cuatro veces más rápido que el primer ejemplo. Así que mediante el uso de cadenas más cortas se puede reducir el tiempo de 99.78%, y el uso de un StringBuilder que solamente cortar otro 0,16%.