c++ - strncmp




if(str1== str2) versus if(str1.length()== str2.length() && str1== str2) (6)

Ich habe das zweite im Code eines anderen gesehen, und ich nehme an, dass dieser Längenvergleich durchgeführt wurde, um die Code-Produktivität zu erhöhen. Es wurde in einem Parser für eine Skriptsprache mit einem bestimmten Wörterbuch verwendet: Wörter sind 4 bis 24 Buchstaben lang mit dem Durchschnitt von 7-8 Buchstaben, Alphabet enthält 26 lateinische Buchstaben plus "@", "$" und "_".

Der Längenvergleich wurde verwendet, um den == Operator zu bearbeiten, der mit STL-Strings arbeitet, was offensichtlich mehr Zeit benötigt als der einfache Ganzzahlvergleich. Aber gleichzeitig ist die Verteilung des ersten Buchstabens in dem gegebenen Wörterbuch einfach weiter als eine Verteilung der Wörtergröße, so dass zwei erste Buchstaben des Vergleichens von Zeichenfolgen im Allgemeinen häufiger anders sind als die Größen dieser Zeichenfolgen. Das macht Längenvergleich unnötig.

Ich habe ein paar Tests durchgeführt und das habe ich herausgefunden: Während man zwei zufällige Zeichenfolgen millionenfach testet, ist der zweite Weg viel schneller, so dass der Längenvergleich hilfreich erscheint. Aber in einem Arbeitsprojekt läuft es im Debug-Modus noch langsamer und im Release-Modus zu wenig.

Also, meine Frage ist: Warum Längenvergleich kann den Vergleich zu befestigen und warum kann es verlangsamen?

UPD: Ich mag auch diesen zweiten Weg nicht, aber es war aus einem bestimmten Grund getan worden, und ich frage mich, was ist dieser Grund?

UPD2: Ernsthaft, die Frage ist nicht, wie es am besten geht. Ich benutze in diesem Fall nicht einmal mehr STL-Strings. Es ist kein Wunder, dass Längenvergleich unnötig und falsch ist usw. Das Wunder ist - es neigt dazu, in einem bestimmten Test wirklich etwas besser zu funktionieren. Wie ist das möglich?


Die Implementierung des std :: string-Operators == hat keine Möglichkeit zu wissen, ob es schneller wäre, zuerst die Länge zu prüfen oder Zeichen zu prüfen. Die genaue Überprüfung der Länge ist eine Verschwendung für gleichlange Stränge. Daher sind unterschiedliche Implementierungen von STL wahrscheinlich unterschiedlich leistungsfähig.

Legen Sie die explizite Längenprüfung nur als abschließende Optimierung fest (eindeutig kommentiert) und nur dann, wenn Ihr Profiler den Nutzen bestätigt.


Im Allgemeinen sollten Sie dies der STL überlassen und sich nicht darum kümmern.

Wenn dies jedoch ein Bereich ist, den Sie optimieren müssen (was ich ernsthaft bezweifle), UND wenn Sie die Verteilung / Länge der Zeichenfolgen Ihrer Strings verstehen, können Sie eine neue Klasse aus string ableiten und den Operator == überladen, um die Gleichheitstest auf die effizienteste Weise für Ihre Anwendung. (Länge zuerst, erstes Zeichen zuerst, vorwärts, rückwärts, was auch immer).

Das wäre besser, als die "Optimierung" in Ihrem Code verstreut zu haben.


Längenvergleich macht für mich keinen Sinn. Die Verwendung des Vergleichsoperators ist ausreichend


Wenn es darauf ankommt, nehmen Sie an, dass Ihre Bibliothek es bereits getan hat. Verwende deinen Code nicht für Mikrooptimierungen, außer es ist wirklich wichtig.


Der Längenvergleich dient dazu, eine Kurzschlussoptimierung zu versuchen.

Ich gehe davon aus, dass der Längenvergleich schneller ist als der vollständige String-Vergleich, wenn also 99% der Fehlanpassungen eliminiert werden können, ist es schneller, als jedesmal den vollständigen String-Vergleich durchzuführen.

Der Code führt den Längenvergleich aus, es wird fehlschlagen, dann ignoriert er den vollständigen Stringvergleich und überspringt den Code.


Die Länge der std :: string ist sehr wahrscheinlich ein Mitglied des std :: string-Objekts. Im Vergleich dazu könnte das erste Zeichen sehr gut auf dem Heap liegen. Das bedeutet, dass der Vergleich der String-Länge den Referenzort verbessert. Natürlich wird dies mit der Short-String-Optimierung noch komplexer - Lhs[0] könnte sich auf dem Heap befinden, während Rhs[0] auf dem Stack ist.





stdstring