Angenommen, wir haben die folgende Zeichenfolge
string data= "/temp string";
Wenn wir das erste Zeichen entfernen möchten, /
können wir dies auf viele Arten tun:
data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);
Aber wirklich, ich weiß nicht, welcher den besten Algorithmus hat und das schneller macht.
Gibt es einen, der der beste ist oder alle gleich sind?
/
?TrimStart
Das ersten
Zeichen wird nicht entfernt, sondern die Zeichen von Anfang an.Substring
ist der schnellste.TrimStart()
kommt dies nicht in Frage.Antworten:
Die zweite Option ist wirklich nicht die gleiche wie die anderen - wenn die Zeichenfolge "/// foo" ist, wird sie zu "foo" anstelle von "// foo".
Die erste Option erfordert etwas mehr Arbeit als die dritte - ich würde die
Substring
Option als die häufigste und lesbarste betrachten.(Offensichtlich wird jede von ihnen als einzelne Anweisung nichts Nützliches bewirken - Sie müssen das Ergebnis einer Variablen zuweisen, möglicherweise
data
selbst.)Ich würde die Leistung hier nicht berücksichtigen, es sei denn, dies würde tatsächlich zu einem Problem für Sie werden. In diesem Fall würden Sie nur Testfälle haben, und dann ist es einfach, diese Testfälle für jede Option und auszuführen Vergleichen Sie die Ergebnisse. Ich würde erwarten
Substring
, hier wahrscheinlich der Schnellste zu sein, einfach weilSubstring
immer eine Zeichenfolge aus einem einzelnen Block der ursprünglichen Eingabe erstellt wird, währendRemove
zumindest potenziell ein Startblock und ein Endblock zusammengeklebt werden müssen.quelle
Ich weiß, dass dies ein Land der Hyperoptimierung ist, aber es schien eine gute Ausrede zu sein, die Räder zu treten
BenchmarkDotNet
. Das Ergebnis dieses Tests (sogar unter .NET Core) ist,Substring
dass er etwas schneller ist alsRemove
in diesem Beispieltest: 19,37 ns gegenüber 22,52 ns fürRemove
. Also ca. 16% schneller.Ergebnisse:
quelle
Ich würde das erraten
Remove
undSubstring
würde den ersten Platz belegen, da beide einen Teil der Zeichenfolge mit fester Größe schlürfen, währendTrimStart
ein Scan von links mit einem Test für jedes Zeichen durchgeführt wird und dann genau die gleiche Arbeit wie die ausführen muss andere zwei Methoden. Im Ernst, das spaltet die Haare.quelle
Substring
ist schneller alsRemove
, weilRemove
AnrufeSubstring
.Substring
undRemove
stützen sich auf eine private MethodeFillSubstring
.string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
System.PInvoke.EE.AllocateString
auf, um das Zielzeichenfolgenobjekt zuzuweisen, und rufen dann auf,FillSubstring
um Zeichen zu kopieren. Schaue ich auf das Falsche?Substring
>Remove
). Ich werde nicht weiter darauf eingehen, da die Diskussion genug Zeit in Anspruch genommen hat.Sie könnten es profilieren, wenn Sie sich wirklich darum kümmern. Schreiben Sie eine Schleife mit vielen Iterationen und sehen Sie, was passiert. Es besteht jedoch die Möglichkeit, dass dies nicht der Engpass in Ihrer Anwendung ist und TrimStart semantisch korrekt erscheint. Versuchen Sie, den Code vor der Optimierung lesbar zu schreiben.
quelle
TrimStart
richtig, da ist die am wenigsten"//temp string".TrimStart('/')
wird nicht entfernen Sie einfach das erste'/'
.