Im Allgemeinen sollten Sie Funktionsaufrufe im Bedingungsteil einer Schleife vermeiden, wenn sich das Ergebnis während der Iteration nicht ändert.
Die kanonische Form ist daher:
%Vor%Beachten Sie 3 Dinge hier:
!=
und nicht mit <
ausgedrückt.
(Ich habe auch den Typ geändert, weil eine negative Länge nicht sinnvoll ist und die String-Schnittstelle in std::string::size_type
definiert ist, was bei den meisten Implementierungen normalerweise std::size_t
ist.)
Obwohl ... ich gebe zu, dass es weniger für die Leistung als für die Lesbarkeit ist:
x
als auch length
scope so eng wie nötig sind Kurz gesagt: Verwenden Sie das beste Werkzeug für die jeweilige Aufgabe:)
Es hängt von den Inlining- und Optimierungsfähigkeiten des Compilers ab. Im Allgemeinen wird die zweite Variante wahrscheinlich schneller sein (besser: sie wird entweder schneller oder so schnell wie das erste Snippet sein, aber fast nie langsamer).
In den meisten Fällen spielt es jedoch keine Rolle, daher bevorzugen die Leute die erste Variante wegen ihrer Kürze.
Es kommt auf Ihre C ++ - Implementierung / Bibliothek an, der einzige Weg, um sicher zu sein, ist, es zu benchmarken. Es ist jedoch effektiv sicher, dass die zweite Version niemals langsamer als die erste sein wird. Wenn Sie also die Zeichenfolge innerhalb der Schleife nicht ändern, ist dies eine sinnvolle Optimierung.
Wie effizient möchten Sie sein?
Wenn Sie die Zeichenfolge innerhalb der Schleife nicht ändern, wird der Compiler leicht sehen, als die Größe nicht ändert. Machen Sie es nicht komplizierter als Sie müssen!
Obwohl ich Sie nicht unbedingt dazu ermuntere, scheint es schneller zu sein, ständig .length()
zu nennen, als es überraschend in einem int
zu speichern (zumindest auf meinem Computer, wobei ich daran denke, dass ich es benutze) ein MSI-Gaming-Laptop mit i5 4. Gen, aber es sollte nicht wirklich beeinflussen, welcher Weg schneller ist).
Testcode für konstanten Aufruf:
%Vor%Im Durchschnitt lief dies nach Code :: Blocks
für 385msUnd hier ist der Code, der die Länge in einer Variablen speichert:
%Vor%Und das im Durchschnitt um 420ms.
Ich weiß, dass diese Frage bereits eine akzeptierte Antwort hat, aber es gab keine praktisch getesteten Antworten, also habe ich beschlossen, meine 2 Cent zu werfen. Ich hatte die gleiche Frage wie Sie, aber ich fand keine hilfreiche Antworten hier, also habe ich mein eigenes Experiment durchgeführt.
Tags und Links string optimization c++