17

duplicados posibles:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs "cadena" + "cadena" o StringBuilder?

¿Cuál es la prioridad rendimiento y cuáles deben ser las condiciones para preferir cada uno de los siguientes:

String.Format("{0}, {1}", city, state); 

o

city + ", " + state; 

o

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy: Mira este http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh

+0

http: //blogs.msdn.com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx – Freelancer

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer

Respuesta

18
  • El compilador optimizará tanto concat de cadena como sea posible, por lo que las cadenas que se acaban de romper para el corte de línea generalmente se pueden optimizar en una sola cadena literal.
  • concatenación con variables conseguirá compilado en String.Concat
  • StringBuilder puede ser mucho más rápido si está haciendo varias (más de 10 o menos supongo) "modificaciones" en una cadena pero tiene cierta sobrecarga adicional porque asigna más espacio de lo que necesita en su búfer y cambia el tamaño de su búfer interno cuando lo necesita.

Yo personalmente uso String.Format casi todo el tiempo por dos razones:

  • Es mucho más fácil mantener la cadena de formato de reordenación de un montón de variables.
  • String.Format toma un IFormatProvider que se pasa a cualquier tipo IFormattable incrustado en la cadena (como numéricos) para que obtenga el formato numérico apropiado para la cultura especificada y en general solo más control sobre cómo se formatean los valores.

Por ejemplo, ya que algunas culturas utilizan una coma como separador decimal que se desea asegurar, ya sea con o StringBuilder String.Format que especifique CultureInfo.InvariantCulture si quisiera asegurarse de que los números se formatean la forma en que la intención .

Dos más que hay que destacar ...

  • StringBuilder también tiene una función AppendFormat que le da la flexibilidad de String.Format sin necesidad de un segundo tampón innecesaria.
  • Al utilizar StringBuilder, asegúrese de no anular el propósito mediante la concatenación de los parámetros que pasa a Anexar. Es fácil perderse.
1

No hay diference relevante. Pero suponiendo que String.Format internamente utiliza un StringBuilder (se puede ver que con la herramienta de reflector), utilizando directamente StringBuilder.Append debe ser más rápido.

EDITAR: Por supuesto que usar el operador "+" es la peor opción ya que crea una nueva instancia de cadena para cada cadena que está concatenándose.

+0

mal, de acuerdo con el enlace que publiqué a continuación parece que + es la mejor manera – Shimmy

+1

@shimmy, no hay StringBuilder en ese enlace. Además, en esa prueba, solo concatenas 3 cadenas, el número de cadenas afecta mucho el rendimiento. –

+0

La edición es incorrecta. El compilador de C# ensamblará las cadenas u objetos en una matriz y luego invocará String.Concat(). Esperaría que String.Concat (string []) fuera el más eficiente porque la implementación puede asignar la cadena exactamente a la longitud correcta. –