Supongamos que tengo un generador de cadenas en C # que hace esto:
StringBuilder sb = new StringBuilder();
string cat = "cat";
sb.Append("the ").Append(cat).(" in the hat");
string s = sb.ToString();
sería eso tan eficiente o más eficiente como tener:
string cat = "cat";
string s = String.Format("The {0} in the hat", cat);
Si es así, ¿por qué?
EDITAR
Después de algunas respuestas interesantes, me di cuenta de que probablemente debería haber sido un poco más claro en lo que estaba preguntando. No estaba preguntando cuál era más rápido para concatenar una cadena, sino cuál era más rápido para inyectar una cadena en otra.
En los dos casos anteriores, quiero inyectar una o más cadenas en el medio de una cadena de plantilla predefinida.
Perdón por la confusion
string s = "The "+cat+" in the hat";
podría ser el más rápido a menos que se use en un bucle, en cuyo caso el más rápido será con unStringBuilder
inicializado fuera del bucle.Respuestas:
NOTA: Esta respuesta se escribió cuando .NET 2.0 era la versión actual. Es posible que esto ya no se aplique a versiones posteriores.
String.Format
utilizaStringBuilder
internamente:El código anterior es un fragmento de mscorlib, por lo que la pregunta se convierte en "¿es
StringBuilder.Append()
más rápido queStringBuilder.AppendFormat()
"?Sin benchmarking, probablemente diría que el ejemplo de código anterior se ejecutaría más rápidamente usando
.Append()
. Pero es una suposición, intente hacer una evaluación comparativa y / o perfilar los dos para obtener una comparación adecuada.Este tipo, Jerry Dixon, hizo algunos puntos de referencia:
Actualizado:
Lamentablemente, el enlace anterior ha muerto desde entonces. Sin embargo, todavía hay una copia en Way Back Machine:
Al final del día, depende de si su formato de cadena se llamará repetidamente, es decir, si está haciendo un procesamiento de texto serio de más de 100 megabytes de texto, o si se llama cuando un usuario hace clic en un botón de vez en cuando. A menos que esté haciendo un gran trabajo de procesamiento por lotes, me quedaría con String.Format, ayuda a la legibilidad del código. Si sospecha que hay un cuello de botella de perf, pegue un perfilador en su código y vea dónde está realmente.
fuente
.ToString()
alStringBuilder
objeto. Durante muchas iteraciones, ese tiempo hace una gran diferencia y significa que no está comparando manzanas con manzanas. Esa es la razón por la que muestra un rendimiento tan buenoStringBuilder
y probablemente explica su sorpresa. Yo sólo repitió el punto de referencia corregir ese error y dieron los resultados esperados: elString
+
operador fue el más rápido, seguido porStringBuilder
, conString.Format
la retaguardia.De la documentación de MSDN :
fuente
Ejecuté algunos puntos de referencia de rendimiento rápidos, y para 100,000 operaciones con un promedio de más de 10 ejecuciones, el primer método (String Builder) toma casi la mitad del tiempo del segundo (Formato de cadena).
Entonces, si esto es infrecuente, no importa. Pero si es una operación común, es posible que desee utilizar el primer método.
fuente
Esperaría que String.Format sea más lento: tiene que analizar la cadena y luego concatenarla.
Un par de notas:
fuente
Creo que en la mayoría de los casos como esta claridad, y no la eficiencia, debería ser su mayor preocupación. A menos que esté aplastando toneladas de cuerdas, o construyendo algo para un dispositivo móvil de menor potencia, esto probablemente no afectará mucho su velocidad de carrera.
Descubrí que, en los casos en que estoy construyendo cadenas de forma bastante lineal, ya sea hacer concatenaciones rectas o usar StringBuilder es su mejor opción. Sugiero esto en casos donde la mayoría de la cadena que está creando es dinámica. Como muy poco del texto es estático, lo más importante es que esté claro dónde se coloca cada parte del texto dinámico en caso de que necesite actualizarse en el futuro.
Por otro lado, si estás hablando de una gran porción de texto estático con dos o tres variables, incluso si es un poco menos eficiente, creo que la claridad que obtienes de string.Format hace que valga la pena. Utilicé esto a principios de esta semana cuando tuve que colocar un poco de texto dinámico en el centro de un documento de 4 páginas. Será más fácil actualizar ese gran fragmento de texto si está en una sola pieza que tener que actualizar tres piezas que concatenan juntas.
fuente
Aunque solo sea porque string.Format no hace exactamente lo que podrías pensar, aquí hay una repetición de las pruebas 6 años después en Net45.
Concat sigue siendo el más rápido, pero en realidad es menos del 30% de diferencia. StringBuilder y Format difieren apenas en un 5-10%. Obtuve variaciones del 20% ejecutando las pruebas varias veces.
Milisegundos, un millón de iteraciones:
La lección que extraigo es que la diferencia de rendimiento es trivial y, por lo tanto, no debería impedir que escribas el código legible más simple que puedas. Que por mi dinero es a menudo pero no siempre
a + b + c
.fuente
String.Format usa
StringBuilder
internamente ... tan lógicamente que lleva a la idea de que sería un poco menos eficiente debido a una mayor sobrecarga. Sin embargo, una simple concatenación de cadenas es el método más rápido de inyectar una cadena entre otras dos ... en un grado significativo. Rico Mariani demostró esta evidencia en su primer Performance Quiz, hace años. El hecho simple es que las concatenaciones ... cuando se conoce el número de partes de la cadena (sin limitación ... podría concatenar mil partes ... siempre y cuando sepa que siempre son 1000 partes) ... siempre son más rápidas queStringBuilder
o String. Formato. Se pueden realizar con una sola asignación de memoria y una serie de copias de memoria. aquí esta la pruebaY aquí está el código real para algunos métodos String.Concat, que finalmente llaman a FillStringChecked que usa punteros para copiar la memoria (extraída mediante Reflector):
Por lo que entonces:
¡Disfrutar!
fuente
Oh también, el más rápido sería:
fuente
StringBuilder
que se hace para optimizar este tipo de codificación en primer lugar.Realmente depende Para cadenas pequeñas con pocas concatenaciones, en realidad es más rápido solo agregar las cadenas.
Pero para cadenas más grandes (cadenas muy muy grandes), es más eficiente usar StringBuilder.
fuente
En cuyo caso, sugeriría String.Format es el más rápido porque está diseñado para ese propósito exacto.
fuente
Realmente depende de su patrón de uso.
Un punto de referencia detallado entre
string.Join
,string,Concat
ystring.Format
se puede encontrar aquí: String.Format no es adecuado para el registro intensivofuente
Sugeriría que no, ya que String.Format no fue diseñado para concatenación, fue diseñado para formatear la salida de varias entradas, como una fecha.
fuente