Das mag eine blöde Frage sein, aber wie vergleicht sich die Effizienz einer while-Schleife mit der einer for-Schleife? Ich habe immer gelernt, dass wenn Sie können eine For-Schleife verwenden, dann sollte ich. Aber was ist eigentlich der Unterschied zwischen:
%Vor%vergleichen mit:
%Vor%Ich weiß in diesen spezifischen Beispielen, dass der Unterschied wie .000000001% ist, aber wenn wir über große komplexe Schleifen sprechen, was ist der Unterschied?
Wie Sie aus den meisten dieser Antworten ersehen können, ist der Hauptvorteil einer for-Schleife gegenüber einer while-Schleife die Lesbarkeit. Eine For-Schleife ist viel sauberer und viel schöner anzusehen. Es ist auch viel einfacher, mit einer While-Schleife in einer Endlosschleife stecken zu bleiben. Ich würde sagen, dass ich Ihren Lehren zustimme, dass wenn Sie eine for-Schleife verwenden können, sollten Sie, so lange Sie dabei bleiben, Ihre Programmiererfahrungen viel mehr Spaß machen werden.
Ich denke, Sie ziehen die falsche Schlussfolgerung aus dem Rat, den Sie erhalten haben.
Der Grund (in diesem Fall zumindest), das for
-Konstrukt dem while
vorzuziehen, hat nichts mit Effizienz zu tun; Es geht darum, Code zu schreiben, der Ihre Absichten klar und leicht verständlich ausdrückt.
Der for
setzt die Anfangsbedingung, die Inkrementierung und die Exit-Bedingung an einer Stelle zusammen und erleichtert so das Verständnis. Die while
-Schleife verteilt sie herum. Zum Beispiel, in Ihrem Beispiel, was ist der Anfangswert von i? -oh, hast du vergessen es zu spezifizieren? - Das ist der Punkt.
Der Leistungsunterschied zwischen for loop
und while loop
ist kein großes Problem, da moderne Compiler denselben Maschinencode für beide Schleifen generieren können und zweitens beide Schleifen dieselben Operationen erfordern:
Im Allgemeinen sollten Sie for loop
in Ihrem Code aus folgenden Gründen verwenden:
while loop
, daher hilft es bei einer besseren Speicherverwaltung. Ich hoffe, das macht Sinn und würde helfen.
Es hängt etwas von der Sprache ab, möglicherweise und vielleicht vom Compiler, aber die meisten modernen Compiler werden sie genauso behandeln und es wird keinen Unterschied geben.
Stellen Sie sich den Hauptunterschied als Stil vor: Mit einer for
-Schleife müssen Sie nicht nach dem Anfangswert, dem Schwellenwert und dem Inkrement suchen.
Es ist auch viel einfacher, eine unendliche Schleife aus einem while
zu machen, weil du vergessen hast zu inkrementieren.
Nun, wenn die Schleife groß und komplex ist, ist es egal, seit der Overhead des Schleifencodes (für oder während) wird sehr niedrig sein ...
Wie auch immer, wenn du es wirklich wissen willst, dann denke ich, es liegt an dir, deine Idee einzulösen, in Assemblercode. oder Sie können einen Dissembler verwenden, um sich selbst in einer ausführbaren Datei zu suchen. Ссылка (Warnung: Es gibt normalerweise eine Menge Bloat in .exe, also viel Glück!)
Wie in allen Antworten hier erwähnt, würde jeder vernünftige Compiler beide Schleifen in denselben Maschinencode kompilieren.
Ihr Maschinencode (unter Verwendung von MIPS als ex) würde eine Reihe von normalen Assembly-Anweisungen sein, gefolgt von einer Verzweigung (onequal / notequal) in beiden Fällen, wodurch Ihre Effizienz konsistent wird.
Sie könnten jedoch über das Coding-Style-Problem hier diskutieren (Nicht-Effizienz).
Für Schleifen:
* Wahrscheinliche Verwendung: Wenn eine Sammlung von Elementen bereits vorhanden ist und Sie darüber hinwegsehen und die Häufigkeit abrufen möchten, mit der eine bestimmte Eigenschaft angezeigt wird.
While Loops:
Sie wissen nicht, wie oft die Schleife ausgeführt wird. Es gibt einen Exit-Fall, der irgendwann während der Ausführung der Schleife gesetzt / erreicht wird (wenn Sie eine for-Schleife simulieren wollen, verwenden Sie so etwas wie einen Zähler (Extra-Code))
Weiß nicht, um wie viel Ihre Schleife zunehmen wird. Ihr Inkrement / nächster Zug kann dynamisch eingestellt werden. Während Sie dies in einer for-Schleife tun können, müssen Sie das Inkrement bei jeder Iteration berücksichtigen, was zu unlesbarem Code führt, der vermieden werden kann, wenn Sie eine while-Schleife verwenden.
* Wahrscheinliche Verwendung: Einen Stream für einige Daten überschreiben. Sie wissen nicht, wie lange der Stream ist, also ist Ihr Fall, wenn der Stream endet. Da es sich um einen Stream handelt und Sie möglicherweise Daten Zeile für Zeile erhalten, sollten Sie die weißen Zeilen überspringen, um Ihre Inkremente nicht konsistent zu machen.
Tags und Links loops performance