2012-02-03 27 views

Respuesta

9

Sí, hay: realicé un experimento rápido, y parece que la versión de cadena es aproximadamente 3 veces más lenta.

string a = "quickbrownfoxjumpsoverthelazydog"; 
    DateTime t1 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace('o', 'b'); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime t2 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace("o", "b"); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime te = DateTime.Now; 
    Console.WriteLine("{0} {1}", t2-t1, te-t2); 

1.466s vs 4.583s

Esto no es sorprendente, ya que la sobrecarga con cuerdas necesita un bucle extra para ir a través de todos los caracteres del oldString. Este ciclo se ejecuta exactamente una vez, pero la sobrecarga todavía está allí.

+0

gracias por su programa de prueba! – Laguna

+1

+1 Fuera de interés, ¿alguien puede aplicar ingeniería inversa a las sobrecargas de System.String.ReplaceInternal? Estoy interesado en ver si el Dev observó la inmutabilidad en la sobrecarga de char :) – StuartLC

5

Deseo esperarstring.Replace(char, char) para ser potencialmente más rápido, ya que puede asignar exactamente la cantidad correcta de espacio. Sin embargo, dudo que haga una diferencia de rendimiento significativa en muchas aplicaciones del mundo real.

Más importante aún, diría que es más legible, es más claro que terminará con una cadena de la misma longitud.

3

String.Replace(char, char) es más rápido. La razón es simple:

  • reemplazo Char no necesita asignar una cadena con un tamaño diferente, la sustitución de cuerdas necesita averiguar el nuevo tamaño primero o utilice un StringBuilder para la sustitución
  • reemplazo Char no lo hace necesito hacer un chequeo con un rango de una cuerda. Imagine que tiene una cadena como ABCACABCAC y desea reemplazar ABC. Necesitas saber si 3 caracteres coinciden, cuando trabajas con caracteres solo necesitas encontrar un carácter.