Concatenar múltiples cadenas versus String.Format

Aquí hay 2 métodos que resultan lo mismo:

public class MessageManager { public void SendMessage(string name, int count) { string message = "Hi " + name + ". I know you don't like cake, so I bought you " + count + " lollipops. Same thing, right?"; // No boxing. "count" was converted to string somehow. //Console.WriteLine(message); } public void SendMessage2(string name, int count) { string message = String.Format("Hi {0}. I know you don't like cake, so I bought you {1} lollipops. Same thing, right?", name, count); // Boxing "name" and "count" + executing unnecessary code. //Console.WriteLine(message); } } 

Así que supongo que el segundo método será más lento que el primero debido al boxeo y la ejecución de algún código adicional que se encuentra dentro del método String.Format ().

Los he probado con el siguiente método:

 public static class PerformanceTester { public static TimeSpan TestAction(Action action) { Stopwatch timer = new Stopwatch(); timer.Start(); for (ushort i = 0; i < ushort.MaxValue; i++) action("Alex", 1000); timer.Stop(); return timer.Elapsed; } } 

Y aquí está el uso de él:

  static void Main(string[] args) { MessageManager mm = new MessageManager(); TimeSpan ts_m1 = PerformanceTester.TestAction(new Action(mm.SendMessage)); TimeSpan ts_m2 = PerformanceTester.TestAction(new Action(mm.SendMessage2)); Console.WriteLine("First message took time: " + ts_m1.ToString()); Console.WriteLine("Second message took time: " + ts_m2.ToString()); Console.ReadKey(); } 

Salida con mi procesador Intel® Core ™ 2 Duo E8200 (DEBUG):

string_test

Salida con mi procesador Intel® Core ™ 2 Duo E8200 (RELEASE): introduzca la descripción de la imagen aquí

Vi String.Format usado en casi todas partes (guías, blogs, tutoriales, etc.) pero en realidad es más lento que la simple concatenación de cadenas. Sé que cuando hablo de C # no debo preocuparme por el rendimiento, pero los resultados en este ejemplo son demasiado impresionantes. La pregunta es : “¿Existe alguna práctica recomendada donde String.Format sea mejor que la concatenación de cadenas?”

Es en gran parte una cuestión de estilo. Sin embargo, considere un formato más complejo. Por ejemplo, quieres formatear un montón de cosas:

 var s = String.Format("{0,10:N2} {1,-20} {2:P2}", val, description, (val/100)); 

O …

 var s = val.ToString("10:N2") + string.Format("{0,-20}", desc) + (val/100).ToString("P2"); 

Me gusta String.Format llamada String.Format . Separa el formato del contenido de la misma forma en que CSS separa la presentación del contenido HTML. Cuando escribo o examino el código que da formato a la salida, normalmente quiero ver el formato de un vistazo. Los valores reales que se están formateando no son relevantes cuando estoy depurando un problema de formato.

Con la concatenación, tengo que abrirme paso a través de los valores individuales para ver cuál es el formato para cada elemento.

Por último, ¿el rendimiento realmente importa aquí? La mayoría de los progtwigs dedican muy poco tiempo a formatear su salida. Optimizar el código de formato parece una enorme pérdida de tiempo. Escribe lo que sea más fácil de mantener y probar que es correcto.

string.format es como el nombre sugiere para formatear cadenas. puede tomar la cadena de formato y pegarla en un recurso o traducirla. No se trata de rendimiento ni de legibilidad. la concatenación de cadenas simple está bien si dice menos de 5. si desea concatenar más cadenas y desea considerar el rendimiento, use StringBuilder.