Digamos que temos a seguinte string
string data= "/temp string";
Se queremos remover o primeiro caractere /
, podemos fazê-lo de várias maneiras, como:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Mas, realmente, não sei qual deles tem o melhor algoritmo e faz isso mais rápido.
Existe um que seja o melhor ou todos são iguais?
/
?TrimStart
não removerá o primeiro caractere, mas removerá osn
caracteres desde o início.Substring
é o mais rápido.TrimStart()
está completamente fora de questão.Respostas:
A segunda opção realmente não é a mesma que as outras - se a string for "/// foo", ela se tornará "foo" em vez de "// foo".
A primeira opção precisa de um pouco mais de trabalho do que a terceira - eu consideraria a
Substring
opção a mais comum e legível.(Obviamente, cada um deles como uma declaração individual não fará nada de útil - você precisará atribuir o resultado a uma variável, possivelmente a
data
si mesma.)Eu não levaria em consideração o desempenho aqui, a menos que isso estivesse se tornando um problema para você. Nesse caso, a única maneira que você saberia seria ter casos de teste e, em seguida, é fácil executar esses casos de teste para cada opção e compare os resultados. Eu
Substring
provavelmente seria o mais rápido aqui, simplesmente porqueSubstring
sempre acaba criando uma sequência a partir de um único pedaço da entrada original, enquantoRemove
que pelo menos potencialmente deve colar um pedaço inicial e um final.fonte
Sei que essa é uma área de hiper otimização, mas parecia uma boa desculpa para chutar as rodas
BenchmarkDotNet
. O resultado desse teste (inclusive no .NET Core) é queSubstring
é um pouco mais rápido do queRemove
, neste teste de exemplo: 19,37ns vs 22,52ns paraRemove
. Então, cerca de 16% mais rápido.Resultados:
fonte
Eu acho que
Remove
eSubstring
seria o empate para o primeiro lugar, uma vez que ambos Slurp-se uma porção de tamanho fixo da corda, enquantoTrimStart
faz uma varredura da esquerda com um teste em cada personagem e, em seguida, tem de executar exatamente o mesmo trabalho que o outros dois métodos. Sério, porém, isso está dividindo os cabelos.fonte
Substring
é mais rápido queRemove
, porqueRemove
ligaSubstring
.Substring
eRemove
dependem de um método privadoFillSubstring
,.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
para alocar o objeto de sequência de destino e, em seguida, chamamFillSubstring
para copiar caracteres. Estou olhando para a coisa errada?Substring
>Remove
). Não vou comentar mais porque a discussão levou bastante do meu tempo.Você poderia criar um perfil, se realmente se importasse. Escreva um loop de muitas iterações e veja o que acontece. As chances são, no entanto, de que esse não seja o gargalo no seu aplicativo e o TrimStart parece o mais semanticamente correto. Esforce-se para escrever código de forma legível antes de otimizar.
fonte
TrimStart
é o menos correto, já que"//temp string".TrimStart('/')
irá não apenas remover o primeiro'/'
.