Digamos que tenemos la siguiente cadena
string data= "/temp string";
Si queremos eliminar el primer personaje /
, podemos hacerlo de muchas maneras, tales como:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Pero, realmente no sé cuál tiene el mejor algoritmo y lo hago más rápido.
¿Hay uno que sea el mejor o todos sean iguales?
/
?TrimStart
no eliminará el primer carácter, eliminará losn
caracteres desde el principio.Substring
Es el más rápido.TrimStart()
está completamente fuera de discusión.Respuestas:
La segunda opción realmente no es la misma que las otras: si la cadena es "/// foo" se convertirá en "foo" en lugar de "// foo".
La primera opción necesita un poco más de trabajo para comprender que la tercera: vería la
Substring
opción como la más común y legible.(Obviamente, cada uno de ellos como una declaración individual no hará nada útil; deberá asignar el resultado a una variable, posiblemente a
data
sí mismo).No tomaría en cuenta el rendimiento aquí a menos que en realidad se convirtiera en un problema para usted, en cuyo caso la única forma en que lo sabría sería tener casos de prueba, y luego es fácil ejecutar esos casos de prueba para cada opción y compara los resultados. Esperaría
Substring
ser probablemente el más rápido aquí, simplemente porqueSubstring
siempre termina creando una cadena a partir de un solo fragmento de la entrada original, mientras queRemove
tiene que al menos potencialmente unir un fragmento de inicio y un fragmento de final.fuente
Sé que esta es una tierra de hiperoptimización, pero me pareció una buena excusa
BenchmarkDotNet
. El resultado de esta prueba (incluso en .NET Core) es queSubstring
es ligeramente más rápido queRemove
, en esta prueba de muestra: 19.37ns vs 22.52ns paraRemove
. Entonces, ~ 16% más rápido.Resultados:
fuente
Supongo que
Remove
ySubstring
habría empate en el primer lugar, ya que ambos sorber una porción de tamaño fijo de la cadena, mientras queTrimStart
hace una exploración desde la izquierda con una prueba en cada personaje y luego tiene que realizar exactamente el mismo trabajo que el Otros dos métodos. En serio, sin embargo, esto es dividir los pelos.fuente
Substring
es más rápido queRemove
, porqueRemove
llamaSubstring
.Substring
yRemove
confiar en un método privado,FillSubstring
.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
para asignar el objeto de cadena de destino y luego llamanFillSubstring
para copiar caracteres. ¿Estoy mirando lo incorrecto?Substring
>Remove
). No voy a comentar más porque la discusión tomó suficiente tiempo.Podrías perfilarlo, si realmente te importara. Escriba un bucle de muchas iteraciones y vea qué sucede. Sin embargo, es probable que este no sea el cuello de botella en su aplicación, y TrimStart parece el más semánticamente correcto. Esfuércese por escribir el código de manera legible antes de optimizar.
fuente
TrimStart
es lo menos correcto, ya"//temp string".TrimStart('/')
que no solo eliminará el primero'/'
.