2010-09-30 24 views
5
string str = 'my {0} long string {1} need formatting'; 

debería hacer lo siguiente,¿Qué sería más rápido en este contexto String.Format o String.Replace?

str = string.Format(str, "really", "doesn't"); 

o la creación de un método como tal y llamando str = str.ReplaceWithValues("really", "doesn't");

public string ReplaceWithValues(this string str, params object[] values) { 
    string ret = str; 
    for (int i = 0; i < values.Length; i++) { 
     ret = str.Replace(string.Concat("{", i, "}"), values.ToString()); 
    } 
    return ret; 
} 

Parece que StringBuilder.AppendFormat() no es eficiente cuando se trata de hacer reemplazos simples como este ya que va de personaje en personaje a través de la cadena.

+0

¿Necesita una afinación de rendimiento tan extrema o simplemente tiene curiosidad? –

+0

@ Claudio Redi - Solo tengo curiosidad. –

+0

"Parece que' StringBuilder.AppendFormat() 'no es eficiente cuando se trata de hacer reemplazos simples como este ya que va carácter por carácter a través de la cadena." ¿Qué piensas 'string.Replace' does? – mquander

Respuesta

14

¿Por qué quieres reinventar String.Format?

yo sólo tiene que utilizar el método del marco - que hace exactamente lo que quiere, es robusto, y va a tener sentido para los que siguen ...


sólo para satisfacer su curiosidad:

Parece que StringBuilder.AppendFormat() no es eficiente cuando se trata de hacer reemplazos simples como este, ya que va carácter por carácter a través de la cadena.

String.Format, FYI, utiliza StringBuilder.AppendFormat internamente. Dicho esto, StringBuilder.AppendFormat es bastante eficiente. Menciona que va "carácter por carácter" a través de la cadena; sin embargo, en su caso, está utilizando múltiples llamadas a Replace y Concat en su lugar. Un solo pase a través de la cadena con un StringBuilder es probable que sea mucho más rápido. Si realmente necesita saber, podría hacer un perfil para verificar. En mi máquina, consigo los siguientes horarios si funciono ambos de los anteriores 1.000.000 de veces:

String.Format - 1029464 ticks 
Custom method - 2988568 ticks 
+0

Solo tengo curiosidad. No hay nada que esté planeando entrar en desarrollo. –

+0

@Jeremy: Acabo de editar mi respuesta para ayudar tu curiosidad: como puedes ver, el método de estructura es mejor en casi todos los aspectos. ;) –

+0

Acabo de hacer 100 iteraciones de 10k de cada una, y mi método personalizado es 1/2 de la velocidad. Lo cual es extraño después de mirar el código de StringBuilder.AppendFormat(). –

1

Si lo que quieres es concatenar algunas cadenas, ¿por qué no hacer eso?

string result = "my " + x + " long string " + y + " need formatting"; 

o

string result = string.Concat("my ", x, " long string ", y, " need formatting"); 
+0

La misma razón por la que alguien usa cadena.Formato ... es más limpio que un grupo de concats. –

+0

+1 Esta es la solución más rápida: 'string.Concat' utiliza métodos no administrados internamente para crear una nueva cadena. –

+0

En tu ejemplo no es tan malo, pero se pone peludo con algunas cadenas más complejas: '" [{0}] {1}: {2}. "' Se convierte en '" [", x,"] ", y, ":", z, "." '. O con comillas: '" attr1 = \ "{0} \" attr2 = \ "{1} \" "' se convierte en '" attr1 = \ "", x, "\" attr2 = \ "", y, "\ "" '. ¿Cuál es más claro? Luego puede agregar formato como '{0: C}' que también lo simplifica aún más. –

2

El procedimiento personalizado aumentará su costo con cada marcador de posición adicional y producir cadenas de usar y tirar para el recolector de basura con cada llamada intermedia a Replace.

Además de la probabilidad de que string.Format sea mucho más rápido que las llamadas múltiples a Replace, string.Format también incluye sobrecargas en las operaciones sensibles a cultivos.

La flexibilidad e intuición de string.Format es al menos tan convincente como la velocidad.

+0

+1 para –

0

En C# el operador + en realidad se convierte en una cadena.Concat(), y siempre pensé que String.Format("Hello: {0} {1}", "Bob", "Jones") era el más rápido. Resulta que, después de encender una muestra que se ejecutó fuera del depurador, en modo de lanzamiento, ese "Bob" + "Jones" es mucho más rápido. Sin embargo, hay un punto de corte. Creo que alrededor de 8 concatenaciones más o menos, string.Format se vuelve más rápido.

+0

sensible a la cultura Creo que eso es porque '" Bob "+" Jones "' se optimizará a '" BobJones "' en tiempo de compilación en modo Release – Andy

Cuestiones relacionadas