¿Existe una diferencia de rendimiento entre String.Replace (char, char) y String.Replace (string, string) cuando solo necesito reemplazar una vez el carácter con otra?String.Replace (char, char) o Replace (string, string)?
Respuesta
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í.
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.
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 reemplazarABC
. Necesitas saber si 3 caracteres coinciden, cuando trabajas con caracteres solo necesitas encontrar un carácter.
- 1. ¿Qué tiene más sentido: char * string o char * string?
- 2. Diferencia entre char * str = "STRING" y char str [] = "STRING"?
- 3. std :: string vs. char *
- 4. Método String.Replace (char, char) en C#
- 5. Necesita convertir String^en char *
- 6. String to Char array Java
- 7. ¿Hay una necesidad de destruir char * = "string" o char * = new char [6]?
- 8. C char a string (pasando char a strcat())
- 9. inicializar std :: string de char * sin copia
- 10. const unsigned char * to std :: string
- 11. Cómo convertir char * a un sistema :: string^
- 12. Cómo convertir Platform :: String a char *?
- 13. Cómo agregar un char a std :: string?
- 14. Cómo convertir std :: string a const char *?
- 15. Conversión de System :: String a Const Char *
- 16. C++ std :: string y NULL const char *
- 17. stringstream, string y char * confusión de conversión
- 18. Java Optimization String vs Char Arrays
- 19. const char * a const std :: string &
- 20. ¿Cuál usar const char [] o const std :: string?
- 21. String Find/Replace Algorithm
- 22. C# replace string dentro del archivo
- 23. Emacs Case Sensitive Replace String
- 24. Java String replace no funciona
- 25. Obteniendo una matriz char del usuario sin usar un String
- 26. Cómo convertir de char a Platform :: String^(C++/CLI)
- 27. Cómo almacenar un const char * en std :: string?
- 28. ¿Cómo convierto un System :: String^a const char *?
- 29. ¿Por qué usar char [] en lugar de String?
- 30. C++ copy std :: string a char array sin terminación nula
gracias por su programa de prueba! – Laguna
+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