2013-08-23 10 views
5

Ich habe noch nie ein Tutorial oder eine Vorlesung gesehen, die eine klassische For-Schleife ohne die Post-Inkrement-Reihenfolge zeigte.pre-increment vs. post-increment - for-loop Geschwindigkeit

for (int i=0; i<array.length; i++) {} 

Wenn Sie POST-Schritt verwenden, wird die Variable "i" zwischengespeichert werden, bevor sie erhöht wird erhalten! Aber das macht keinen Sinn, weil der Befehl direkt endet.

Meiner Meinung nach, macht dies mehr Sinn:

for (int i=0; i<array.length; ++i) {} 

Wenn Sie bis jetzt nicht verstanden, gehe ich ein bisschen weiter (sry für mein Englisch):

In der ersten Schleife :

  1. Cache den tatsächlichen Wert von i. (Anmerkung: keine Bewegung zwischen, also keinen Grund, dies zu tun)
  2. Erhöhungsschritte i
  3. Go ahead

In der zweiten Schleife:

  1. Erhöhungsschritte i direkt
  2. Go voraus.

So ist die zweite Schleife leistungsfähiger für keinen Qualitätsverlust. Irgendwelche anderen Meinungen?

+1

Die einzige Möglichkeit zu wissen, ob die zweite Schleife leistungsfähiger ist, besteht darin, sie zu messen (vorausgesetzt, der erzeugte Assemblercode ist anders). Mit einem 'int' bezweifle ich, dass es einen Unterschied macht. Vielleicht mit einigen Iteratortypen. ** Bearbeiten ** Ich spreche C++ hier. – juanchopanza

+2

Wenn Sie sagen "die Variable * wird zwischengespeichert *", verwenden Sie irgendein Verständnis oder Forschung der Situation, oder spekulieren Sie nur? –

+6

Ich sah ein C++ - Tag, aber dann verschwand es und ich sehe nur Java, also postete ich das dup für Java. –

Antwort

6

In Java ist es sinnlos, auf dieser Ebene zu denken. Die Java-Laufzeit ist so weit entfernt von dem, was Sie im Java-Quellcode schreiben, dass diese Art von Argumentation jede Bedeutung verliert. Insbesondere wird der JIT-Compiler Ihren Code auf Maschinencodeebene unverständlich machen.

+0

Es spielt also keine Rolle, in welchem ​​Fall Sie es schreiben, der Compiler macht es zu dem, zu dem es gehört? Ich würde meinen Schülern das so beibringen, Post- und Pre-Condition (wenn ich ein Lehrer wäre), weil dies ein gewisses "Hintergrundwissen" hat, das immer interessant sein kann. Aber es ist interessant, dass es egal ist. Danke für deine Antwort! :) – codepleb

+0

Javas Just-in-Time-Compiler macht so viele kompliziertere Dinge, dass dies fast gar nicht ins Bild kommt. Zum Beispiel kann es Ihre gesamte * Schleife * löschen, wenn es erkennt, dass es keine Nebenwirkungen hat. –

+0

Das mag stimmen, aber die Programmierlogik würde besser passen, wenn ich das auf "meine" Weise mache, und das verstehe ich. Natürlich ist es egal, aber warum sollte ich nicht die Logik schreiben, der Compiler würde auch schreiben? Wie auch immer, gut, aber ich würde nicht ändern, was ich im Moment mache. :) – codepleb