Compileroptimierung?

Orolhawion

Aktives Mitglied
Hallo zusammen,

folgender Code:
Code:
boolean isSomething = false;
for (int i=0; i<5; i++) {
     if (i<=0) {
          isSomething = true;
     }
}
Die Frage dazu lautet: Würde hier tatsächlich 5x true auf isSomething geschrieben, oder optimiert der Compiler das irgendwie, so dass es nur bei der ersten Iteration geschrieben wird und danach nicht mehr, weil's ja schon true ist?
 

Orolhawion

Aktives Mitglied
Nun, das Beispiel ist sehr vereinfacht und ich will gar nicht die Schleife verlassen, jedenfalls nicht deswegen. Abgesehen davon wurden zum Verlassen von Schleifen boolsche Ausdrücke im Schleifenkopf erfunden.
 

Tarrew

Top Contributor
Habe die Funktion mal kopiert und mir den Assembler Code angeguckt. Die gesamte Funktion wurde praktisch wegoptimiert, da ja eh nichts mit der Variable gemacht wird. Deswegen habe ich einfach mal eine einfache Zuweisung darunter geschrieben:

Java:
public class Test {
    static boolean a;

    public static void main(String[] args) {
            doSth();
    }

    public static void doSth() {
        boolean isSomething = false;
        for (int i = 0; i < 5; i++) {
            if (i >= 0) {
                isSomething = true;
            }
        }
        a = isSomething;
    }
}

Der Assembler-Code dazu sieht so aus:
Code:
  # {method} {0x00007f6f44c00338} 'doSth' '()V' in 'Test'
  #           [sp+0x20]  (sp of caller)
  0x00007f6f451118e0: sub    rsp,0x18
  0x00007f6f451118e7: mov    QWORD PTR [rsp+0x10],rbp  ;*synchronization entry
                                                ; - Test::doSth@-1 (line 11)

  0x00007f6f451118ec: mov    r10,0xec4a7930     ;   {oop(a 'java/lang/Class' = 'Test')}
  0x00007f6f451118f6: mov    BYTE PTR [r10+0x68],0x1  ;*putstatic a
                                                ; - Test::doSth@22 (line 17)

  0x00007f6f451118fb: add    rsp,0x10
  0x00007f6f451118ff: pop    rbp
  0x00007f6f45111900: test   DWORD PTR [rip+0x189d56fa],eax        # 0x00007f6f5dae7000
                                                ;   {poll_return}
  0x00007f6f45111906: ret

Im Prinzip wird die ganze for-Schleife rausoptimiert und der Variable a einfach direkt der Wert 1 zugewiesen.
 

Joose

Top Contributor
Der Compiler selbst kann hier und da bestimmte Codestellen natürlich optimieren, man kann auch versuchen Code so zu schreiben das er vom Compiler optimiert wird.
Aber da würde den Code sehr unschön werden lassen.
 

Neue Themen


Oben