Disons que nous avons la chaîne suivante
string data= "/temp string";
Si nous voulons supprimer le premier caractère, /
nous pouvons le faire de nombreuses manières, telles que:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Mais, vraiment, je ne sais pas lequel a le meilleur algorithme et le fait plus rapidement. Y en a -
t-il un qui est le meilleur ou tous sont les mêmes?
/
?TrimStart
ne supprimera pas le premier caractère, il supprimera lesn
caractères du début.Substring
est le plus rapide.TrimStart()
est totalement hors de question.Réponses:
La deuxième option n'est vraiment pas la même que les autres - si la chaîne est "/// foo" elle deviendra "foo" au lieu de "// foo".
La première option nécessite un peu plus de travail pour comprendre que la troisième - je considérerais l'
Substring
option comme la plus courante et la plus lisible.(Évidemment, chacun d'eux en tant qu'instruction individuelle ne fera rien d'utile - vous devrez attribuer le résultat à une variable, peut
data
- être elle - même.)Je ne prendrais pas en compte les performances ici à moins que cela ne devienne réellement un problème pour vous - dans ce cas, la seule façon dont vous le sauriez serait d'avoir des cas de test, puis il est facile de simplement exécuter ces cas de test pour chaque option et comparer les résultats. Je m'attendrais
Substring
à être probablement le plus rapide ici, tout simplement parce qu'ilSubstring
finit toujours par créer une chaîne à partir d'un seul morceau de l'entrée d'origine, alors qu'ilRemove
doit au moins potentiellement coller ensemble un morceau de début et un morceau de fin.la source
Je sais que c'est une terre d'hyper-optimisation, mais cela semblait être une bonne excuse pour lancer les roues
BenchmarkDotNet
. Le résultat de ce test (sur .NET Core même) estSubstring
toujours légèrement plus rapide queRemove
dans cet exemple de test: 19,37 ns contre 22,52 ns pourRemove
. Donc, environ 16% plus rapidement.Résultats:
la source
Je devinerais cela
Remove
etSubstring
j'attacherais pour la première place, car ils absorbent tous les deux une partie de taille fixe de la chaîne, tandisTrimStart
qu'un balayage à partir de la gauche avec un test sur chaque caractère et doit ensuite effectuer exactement le même travail que le deux autres méthodes. Sérieusement, cependant, cela divise les cheveux.la source
Substring
est plus rapide queRemove
, parce que lesRemove
appelsSubstring
.Substring
etRemove
compter sur une méthode privée,FillSubstring
.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
pour allouer l'objet chaîne de destination, puis appellentFillSubstring
pour copier des caractères. Suis-je en train de regarder la mauvaise chose?Substring
>Remove
). Je ne vais pas commenter davantage car la discussion a pris assez de temps.Vous pouvez le profiler si vous vous en souciez vraiment. Écrivez une boucle de nombreuses itérations et voyez ce qui se passe. Il y a cependant des chances que ce ne soit pas le goulot d'étranglement dans votre application, et TrimStart semble le plus sémantiquement correct. Efforcez-vous d'écrire le code de manière lisible avant d'optimiser.
la source
TrimStart
est le moins correct, car"//temp string".TrimStart('/')
ne pas supprimer tout simplement le premier'/'
.