Verwendet string.length () in der Schleife effizient?

7

Angenommen, ein string s ist dies:

%Vor%

besser als das?:

%Vor%

Danke, Joel

    
Joel 27.02.2011, 19:16
quelle

6 Antworten

11

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:

  • Die Initialisierung kann mehr als eine Variable initialisieren
  • Die Bedingung wird mit != und nicht mit < ausgedrückt.
  • Ich benutze Pre-Inkrement statt Post-Inkrement

(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:

  • Die doppelte Initialisierung bedeutet, dass sowohl x als auch length scope so eng wie nötig sind
  • Durch das Memoisieren des Ergebnisses bleibt der Leser nicht im Zweifel, ob die Länge während der Iteration variieren kann oder nicht
  • Die Verwendung von pre-increment ist normalerweise besser, wenn Sie kein temporäres mit dem "alten" Wert
  • erstellen müssen

Kurz gesagt: Verwenden Sie das beste Werkzeug für die jeweilige Aufgabe:)

    
Matthieu M. 27.02.2011, 19:20
quelle
4

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.

    
Alexander Gessler 27.02.2011 19:20
quelle
3

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.

    
Tim Martin 27.02.2011 19:19
quelle
1

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!

    
Bo Persson 27.02.2011 19:21
quelle
0

Ist s.length () inline und gibt eine Membervariable zurück? dann keine, sonst die Kosten der Dereferenzierung und das Einfügen von Sachen im Stapel, Sie wissen, dass alle Gemeinkosten der Funktionsaufruf Sie für jede Iteration entstehen.

    
Murali VP 27.02.2011 19:21
quelle
0

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 385ms

Und 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.

    
FluorescentGreen5 05.09.2016 08:46
quelle

Tags und Links