Wird mit string.Länge() in der Schleife, die leistungsfähig?
Beispielsweise vorausgesetzt, dass eine string s
ist diese:
for(int x = 0; x < s.length(); x++)
besser als dieses hier?:
int length = s.length();
for(int x = 0; x < length; x++)
Dank,
Joel
- Die erste betrifft die Funktionsaufruf-overhead einmal für jede iteration der Schleife, anstatt nur einmal. Soweit ich weiß, die
.length()
Methode kann führen, in eine nicht-triviale Berechnung (z.B. einer Schleife über den string suchen eine abschließende Charakter), dies ist jedoch extrem unwahrscheinlich, dass auf jeder realen Implementierung, AFAICT. - Ich bin mir nicht ganz sicher (wie ich bin nicht vertraut mit der Durchführung der STL-string), aber es scheint mir, dass Sie würde nehmen Sie die gleiche Menge an Zeit, außer
int length
Kosten würde, Siesizeof(int)
mehr Speicher. Dies ist unter der Annahme, dasss.length()
gibt einfach ein integer-Wert, der gespeichert wurde in der Struktur. - Ich denke, dass
.length
ist garantiert zuO(1)
, dastd::string
gehorcht derSequence
Anforderungen. - Ich fragte diese Frage, weil ich habe auf einigen blog 'nie verwenden, en.Länge() in der bedingten in eine Schleife, weil es die Suche durch die Zeichenfolge zu finden, der NULL-terminator jeder Zeit.' Wollte nur wissen, ob das richtig war.
- Das wäre der wahre
strlen()
, aberstring.length()
können nicht umgesetzt werden in der offensichtlichen Weise mit einem nul-terminator dastd::string
ermöglicht nul (null) bytes in der Zeichenfolge. - Der C++ - standard garantiert nicht, dass
.length()
ständige Komplexität in den Anforderungen für container (23.1) heißt es: "sollte" statt "soll", die es Spielraum. Ich glaube nicht, dass es in der Praxis irgendwelche mainstream-Implementierungen, die Komplexität schlechter als linear, jedoch. - In C++0x n3225 (21.4.4),
size()
ist garantiert Konstante-Zeit undlength()
ist definiert als Gibt:size()
ohne diese Garantie. Ich weiß nicht, ob Sie meinen, dass es ist nur ein alias, oder, wenn dies erlaubt eine höhere Komplexität :/ - Ich bezog mich auf die 2003 Version von 1998 mit dem standard. Es ist gut zu wissen, dass dies verschärft in der kommende standard.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen sollten Sie es vermeiden, Funktionsaufrufe in dem Zustand, Teil einer Schleife, wenn das Ergebnis nicht ändern während der iteration.
Die kanonische form ist daher:
Anmerkung 3 Sachen hier:
!=
eher als<
(Ich habe auch die Art geändert, da eine negative Länge ist nicht-Sinn und die string-Schnittstelle definiert ist, in der Bezeichnung des
std::string::size_type
, die in der Regelstd::size_t
auf den meisten Implementierungen).Obwohl... ich gebe zu, dass es nicht so viel für die Leistung als für die Lesbarkeit:
x
undlength
Rahmen ist so fest wie nötigKurz gesagt: verwenden Sie das beste Werkzeug für den job bei der hand 🙂
length
gibt einesize_t
.Hängt es von der inlining und-Optimierung Fähigkeiten des Compilers. Generell ist die zweite Variante wird wahrscheinlich schneller sein (besser: es wird entweder schneller oder genauso schnell wie der erste Schnipsel, aber fast nie langsamer).
Jedoch in den meisten Fällen, es spielt keine Rolle, so dass die Leute neigen dazu, lieber die erste Variante für seine Kurzatmigkeit.
Kommt es auf Ihre C++ - Implementierung /Bibliothek, der einzige Weg, um sicher zu sein, ist es zum benchmark. Es ist jedoch effektiv sicher, dass die zweite version wird nie langsamer sein als die erste, so, wenn Sie nicht ändern Sie die Zeichenfolge innerhalb der Schleife ist es eine sinnvolle Optimierung zu stellen.
Wie effizient willst du werden?
Wenn Sie nicht ändern Sie die Zeichenfolge innerhalb der Schleife, wird der compiler leicht zu sehen, als die Größe ändert sich nicht. Machen Sie es nicht komplizierter als es sein muss!
Ich bin zwar nicht unbedingt ermutigend, dies zu tun, es scheint schneller zu ständig rufen
.length()
als to bewahren Sie es in einerint
überraschend (mindestens auf meinem computer, wenn man bedenkt, dass ich mit einem MSI-gaming-laptop mit i5 4. gen, aber es sollte nicht wirklich Einfluss auf die Art und Weise ist schneller).Test-code für Konstante nennen:
Durchschnittlich lief es für 385ms nach Code::Blocks
Und hier ist der code, speichert die Länge in einer Variablen:
Und diese gemittelt etwa 420ms.
Ich weiß, diese Frage hat bereits eine akzeptierte Antwort, aber es noch nicht praktisch getestet Antworten, und so beschloss ich werfe meine 2 Cent. Ich hatte die gleiche Frage wie Ihr, aber ich fand keine hilfreichen Antworten hier, so lief ich mein eigenes experiment.
Ist.Länge() inline und gibt eine member-variable ist? dann Nein, sonst Kosten von Dereferenzierung und setzen Sachen in Stapel, Sie kennen alle die Kosten des Funktionsaufrufs Sie entstehen, werden für jede iteration.