¿El uso de una lista de caracteres es más rápido para realizar la concatenación de múltiples cadenas?

StackOverflow https://stackoverflow.com/questions/1750811

  •  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.

¿Fue útil?

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%.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top