For Loop oder While Loop - Effizienz

8

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?

    
jwegner 18.11.2010, 18:21
quelle

8 Antworten

4

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.

    
Brendan 18.11.2010, 19:35
quelle
11

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.

    
David Gelhar 18.11.2010 18:27
quelle
4

Das hängt von dem genauen Compiler ab, den Sie verwenden. In Ihrem Beispiel erstellt ein guter Compiler den gleichen Maschinencode für beide Optionen.

    
Heinzi 18.11.2010 18:25
quelle
3

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:

  1. Initialisierung der Zählervariable.
  2. Testbedingung.
  3. Erhöht / verringert die Zählervariable.

Im Allgemeinen sollten Sie for loop in Ihrem Code aus folgenden Gründen verwenden:

  1. Um die Lesbarkeit Ihres Codes zu erhöhen.
  2. Um die Wartbarkeit Ihres Codes zu verbessern, da alle drei Hauptteile einer Schleife, d. h. Initialisierung, Inkrementieren / Dekrementieren und Testbedingung, in der gleichen Zeile (in den meisten Fällen) geschrieben werden.
  3. Es limitiert den Bereich von Counter-Variablen besser als while loop , daher hilft es bei einer besseren Speicherverwaltung.

Ich hoffe, das macht Sinn und würde helfen.

    
पवन 27.09.2012 12:40
quelle
2

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.

    
The Archetypal Paul 18.11.2010 18:24
quelle
1

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.

    
Brad 18.11.2010 18:26
quelle
1

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!)

    
adfgadhj 18.11.2010 18:33
quelle
1

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:

  1. Wird verwendet, wenn Sie EXAKT wissen, wie oft die Schleife ausgeführt wird. Exit-Fall ist bekannt.
  2. Wissen um den Betrag, um den Ihre Schleife bei jeder Iteration erhöht wird

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

  1. 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))

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

    
The Platypus 27.06.2014 20:56
quelle

Tags und Links